C# C 4.0列表的序列化

C# C 4.0列表的序列化,c#,c#-4.0,.net-4.0,xml-serialization,C#,C# 4.0,.net 4.0,Xml Serialization,在C4.0中,我有一个名为Customer的标准对象,它有属性和一个公共空构造函数 我需要将一个通用列表序列化为XML,以便保存它,然后加载它并反序列化它 现在是否有比.NET 2.0更简单的框架支持呢?Linq有XML支持,但在我看来,System.XML.Serialization方法非常简单。编写一个具有公共属性的类,如果它足够简单,您甚至不需要对它进行注释。只需创建一个序列化程序并在其上使用流,就可以了。框架对此的支持基本不变,但非常易于使用。以下是我在商品库中使用的内容: public

在C4.0中,我有一个名为Customer的标准对象,它有属性和一个公共空构造函数

我需要将一个通用列表序列化为XML,以便保存它,然后加载它并反序列化它


现在是否有比.NET 2.0更简单的框架支持呢?

Linq有XML支持,但在我看来,System.XML.Serialization方法非常简单。编写一个具有公共属性的类,如果它足够简单,您甚至不需要对它进行注释。只需创建一个序列化程序并在其上使用流,就可以了。

框架对此的支持基本不变,但非常易于使用。

以下是我在商品库中使用的内容:

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);
}

我只是在XML输出上强制使用UTF8编码。

序列化将对象实例转换为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教程

两个版本之间的XML序列化程序没有变化。你以前觉得什么困难?还有一个DataContractSerializer,您可能会发现它更简单。如果我没记错的话,DataContractSerializer是一个痛苦的东西,因为它对元素顺序很挑剔,而XMLSerializer不是。Cory,您能否也包括XmlStringWriter。-1:Cory,我投反对票,因为这段代码将XML作为字符串传递。一点也不好。我很想知道为什么这是个坏主意?你应该用什么来代替?@John:对于序列化,你希望它做什么?这个特殊的助手类位于一个应用程序中,该应用程序生成XML标记作为DAO包装的一部分,我很乐意学习更好的技术@科里:我更喜欢它传递一个XmlReader,或者XElement,或者XmlDocument——实际上代表XML的东西。字符串可以是任何东西,通常是。我试图让人们摆脱创造字符串person=;看到代码有问题吗?
//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;