C # 4.0 Сериализация списка <Customer> - PullRequest
0 голосов
/ 30 марта 2011

В C # 4.0 у меня есть стандартный объект, который называется «Клиент». Он имеет свойства и открытый пустой конструктор.

Мне нужно сериализовать универсальный List<Customer> в XML, чтобы я мог сохранить его, затем загрузить и десериализовать обратно.

Есть ли сейчас поддержка фреймворка для этого, что проще, чем это было в .NET 2.0?

Ответы [ 4 ]

3 голосов
/ 30 марта 2011

Фреймворк для этого поддерживает XmlSerializer , который в основном неизменен, но очень прост в использовании.

2 голосов
/ 30 марта 2011

Вот что я использую в своей библиотеке вкусностей:

public static string SerializeAsXml<TSource>(object element) where TSource : new()
{
    return SerializeAsXml<TSource>(element, new Type[] {});
}

public static string SerializeAsXml<TSource>(object element, Type[] extraTypes) where TSource : new()
{
    var serializer = new XmlSerializer(typeof(TSource), extraTypes);
    var output = new StringBuilder();
    using (StringWriter writer = new XmlStringWriter(output))
    {
        serializer.Serialize(writer, element);
    }
    return output.ToString();
}

public static TDestination Deserialize<TDestination>(string xmlPath) where TDestination : new()
{
    return Deserialize<TDestination>(xmlPath, new Type[] { });
}

public static TDestination Deserialize<TDestination>(string xmlPath, Type[] extraTypes) where TDestination : new()
{
    using (var fs = new FileStream(xmlPath, FileMode.Open))
    {
        var reader = XmlReader.Create(fs);
        var serializer = new XmlSerializer(typeof(TDestination), extraTypes);
        if (serializer.CanDeserialize(reader))
        {
            return (TDestination)serializer.Deserialize(reader);
        }
    }
    return default(TDestination);
}

Не супер просто, но это работает.Обратите внимание, что десериализация происходит только из пути, но вы можете легко изменить его, чтобы десериализовать из строки, просто удалите FileStream.

XmlStringWriter выглядит следующим образом:

public class XmlStringWriter : StringWriter
{

    public XmlStringWriter(StringBuilder builder)
        : base(builder)
    {

    }

    public override Encoding Encoding
    {
        get { return Encoding.UTF8; }
    }

}

Я просто использую кодировку UTF8 в выводе XML.

2 голосов
/ 30 марта 2011

Linq поддерживает XML, но IMO способ System.Xml.Serialization довольно прост. Напишите класс с открытыми свойствами, и если он достаточно прост, вам даже не нужно его аннотировать. Просто создайте сериализатор и используйте для него поток, и все готово.

0 голосов
/ 21 января 2012

Сериализация (преобразование экземпляра объекта в документ XML):

// Assuming obj is an instance of an object
XmlSerializer ser = new XmlSerializer(obj.GetType());
System.Text.StringBuilder sb = new System.Text.StringBuilder();
System.IO.StringWriter writer = new System.IO.StringWriter(sb);
ser.Serialize(writer, obj);
XmlDocument doc = new XmlDocument();
doc.LoadXml(sb.ToString());

Десериализация (преобразование документа XML в экземпляр объекта):

//Assuming doc is an XML document containing a serialized object and objType is a System.Type set to the type of the object.
XmlNodeReader reader = new XmlNodeReader(doc.DocumentElement);
XmlSerializer ser = new XmlSerializer(objType);
object obj = ser.Deserialize(reader);
// Then you just need to cast obj into whatever type it is eg:
MyClass myObj = (MyClass)obj;

Вы также можете попробовать учебник по MSDN. Сериализация (C # и Visual Basic)

...