Porównaj ceny domen i usług IT, sprzedawców z całego świata

Łatwe nagranie całej instancji klasy w pliku XML i przeczytaj go z powrotem.


Mam główną klasę o nazwie
theGarage
, która zawiera instancje naszych klas klientów, dostawców i zleceń.
Chcę zapisać dane programu do pliku XML, użyłem kodu poniżej (tylko fragment, mam odpowiedni kod dla innych klas). Zastanawiam się, czy jest dla mnie prostsza droga, aby to zrobić, na przykład, nagrać całą klasę thargage do pliku XML i przeczytaj go bez konieczności zapisywania całego tego kodu, jak mam poniżej.
public void saveToFile()
{
using (XmlWriter writer = XmlWriter.Create("theGarage.xml"))
{
writer.WriteStartDocument();///
writer.WriteStartElement("theGarage");
writer.WriteStartElement("Customers"); foreach (Customer Customer in Program.theGarage.Customers)
{
writer.WriteStartElement("Customer");
writer.WriteElementString("FirstName", Customer.FirstName);
writer.WriteElementString("LastName", Customer.LastName);
writer.WriteElementString("Address1", Customer.Address1);
writer.WriteElementString("Address2", Customer.Address2);
writer.WriteElementString("Town", Customer.Town);
writer.WriteElementString("County", Customer.County);
writer.WriteElementString("PostCode", Customer.Postcode);
writer.WriteElementString("TelephoneHome", Customer.TelephoneHome);
writer.WriteElementString("TelephoneMob", Customer.TelephoneMob);//begin vehicle list
writer.WriteStartElement("Vehicles"); foreach (Vehicle Vehicle in Customer.Cars)
{
writer.WriteStartElement("Vehicle");
writer.WriteElementString("Make", Vehicle.Make);
writer.WriteElementString("Model", Vehicle.Model);
writer.WriteElementString("Colour", Vehicle.Colour);
writer.WriteElementString("EngineSize", Vehicle.EngineSize);
writer.WriteElementString("Registration", Vehicle.Registration);
writer.WriteElementString("Year", Vehicle.YearOfFirstReg);
writer.WriteEndElement();
}
writer.WriteEndElement();
writer.WriteEndElement();
}
}
}

Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Zamiast tego jest znacznie prostszy sposób na serializację obiektów, użyj
XMlserializer
. Zobacz dokumentację

tutaj
http://msdn.microsoft.com/en-u ... .aspx
.
Fragment kodu do serializacji garażu do pliku może wyglądać następująco:
var garage = new theGarage();// TODO init your garage..XmlSerializer xs = new XmlSerializer(typeof(theGarage));
TextWriter tw = new StreamWriter(@"c:\temp\garage.xml");
xs.Serialize(tw, garage);

I kod do załadowania garażu z pliku:
using(var sr = new StreamReader(@"c:\temp\garage.xml"))
{
garage = (theGarage)xs.Deserialize(sr);
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Co powiesz na kilka świetnych metod rozszerzania, możesz łatwo czytać/zapisywać to do/z pliku.
public static class Extensions
{
public static string ToXml(this object obj)
{
XmlSerializer s = new XmlSerializer(obj.GetType());
using (StringWriter writer = new StringWriter())
{
s.Serialize(writer, obj);
return writer.ToString();
}
} public static T FromXml<T>(this string data)
{
XmlSerializer s = new XmlSerializer(typeof(T));
using (StringReader reader = new StringReader(data))
{
object obj = s.Deserialize(reader);
return (T)obj;
}
}
}

przykład
var xmlData = myObject.ToXml(); var anotherObject = xmlData.FromXml<ObjectType>();
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Właśnie napisałem wiadomość do

wpis na blogu dotyczący zapisywania danych obiektu w binarnym formacie XML lub Json
http://blog.danskingdom.com/sa ... ile/. Oto funkcje do nagrywania i czytania instancji klasy/z XML. Aby uzyskać więcej informacji, zobacz mój blog.
Wymagane jest, aby zespół System.xml jest zawarty w projekcie.
/// <summary>
/// Writes the given object instance to an XML file.
/// <para>Only Public properties and variables will be written to the file. These can be any type though, even other classes.</para>
/// <para>If there are public properties/variables that you do not want written to the file, decorate them with the [XmlIgnore] attribute.</para>
/// <para>Object type must have a parameterless constructor.</para>
/// </summary>
/// <typeparam name="T">The type of object being written to the file.</typeparam>
/// <param name="filePath">The file path to write the object instance to.</param>
/// <param name="objectToWrite">The object instance to write to the file.</param>
/// <param name="append">If false the file will be overwritten if it already exists. If true the contents will be appended to the file.</param>
public static void WriteToXmlFile<T>(string filePath, T objectToWrite, bool append = false) where T : new()
{
TextWriter writer = null;
try
{
var serializer = new XmlSerializer(typeof(T));
writer = new StreamWriter(filePath, append);
serializer.Serialize(writer, objectToWrite);
}
finally
{
if (writer != null)
writer.Close();
}
}/// <summary>
/// Reads an object instance from an XML file.
/// <para>Object type must have a parameterless constructor.</para>
/// </summary>
/// <typeparam name="T">The type of object to read from the file.</typeparam>
/// <param name="filePath">The file path to read the object instance from.</param>
/// <returns>Returns a new instance of the object read from the XML file.</returns>
public static T ReadFromXmlFile<T>(string filePath) where T : new()
{
TextReader reader = null;
try
{
var serializer = new XmlSerializer(typeof(T));
reader = new StreamReader(filePath);
return (T)serializer.Deserialize(reader);
}
finally
{
if (reader != null)
reader.Close();
}
}


Przykład
>
// Write the list of salesman objects to file.
WriteToXmlFile<Customer>("C:\TheGarage.txt", customer);// Read the list of salesman objects from the file back into a variable.
Customer customer = ReadFromXmlFile<Customer>("C:\TheGarage.txt");
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Do mojego projektu używam

DataContractSerializer
http://msdn.microsoft.com/en-u ... aspx. w odróżnieniu

od
http://msdn.microsoft.com/en-u ... .aspx
XmlSerializer, może obsługiwać wiele odwołań do tego samego obiektu w taki sposób, że dane nie są zduplikowane w xml i są przywracane jako zapisane.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się