如何序列化List <T>?

Oce*_*ean 11 c# xml serialization list

我有A班.B班和C班是A班的一部分.

Class A 
{

//Few Properties of Class A

List<typeof(B)> list1 = new List<typeof(B)>()

List<typeof(C)> list2 = new List<typeof(C)>()

Nsystem NotSystem { get; set; } // Enum Property Type

}

public enum Nsystem {
    A = 0,
    B = 1,
    C = 2
}
Run Code Online (Sandbox Code Playgroud)

我想序列化A类,并希望用它生成XML; 我还想序列化list1和list2以及枚举...

序列化这个XML有什么好方法,因为我需要将Object转换为XML和XML转换为Object的功能......

有什么好的选择呢?谢谢

Bro*_*ass 10

您可以使用XMLSerializer:

var aSerializer = new XmlSerializer(typeof(A));
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
aSerializer.Serialize(sw, new A()); // pass an instance of A
string xmlResult = sw.GetStringBuilder().ToString();
Run Code Online (Sandbox Code Playgroud)

为了使其正常工作,您还需要对类型进行xml注释,以确保使用正确的命名进行序列化,即:

public enum NSystem { A = 0, B = 1, C = 2 }

[Serializable]
[XmlRoot(ElementName = "A")]
Class A 
{
 //Few Properties of Class A
 [XmlArrayItem("ListOfB")]
 List<B> list1;

 [XmlArrayItem("ListOfC")]
 List<C> list2;

 NSystem NotSystem { get; set; } 
}
Run Code Online (Sandbox Code Playgroud)

编辑:

Enum默认情况下,属性是序列化的,属性名称包含XML元素,其枚举值为XML值,即如果NotSystem示例中的属性具有值C,则将其序列化为

<NotSystem>C</NotSystem>
Run Code Online (Sandbox Code Playgroud)

当然,您总是可以通过执行正确的注释来更改属性序列化的方式,即使用 [XmlAttribute]它将序列化为属性,或者 [XmlElement("Foobar")]使用Foobar元素名称进行序列化.有关MSDN的更多文档,请查看上面的链接.


And*_*rew 7

使用IO错误捕获对任何对象进行二进制序列化的简单方法。

List<Cookie> asdf = new List<Cookie>();

//Serialization
Serializer.Save("data.bin", asdf);

//Deserialization
asdf = Serializer.Load<List<Cookie>>("data.bin");
Run Code Online (Sandbox Code Playgroud)

序列化器类:

public static class Serializer
{
    public static void Save(string filePath, object objToSerialize)
    {
        try
        {
            using (Stream stream = File.Open(filePath, FileMode.Create))
            {
                BinaryFormatter bin = new BinaryFormatter();
                bin.Serialize(stream, objToSerialize);
            }
        }
        catch (IOException)
        {
        }
    }

    public static T Load<T>(string filePath) where T : new()
    {
        T rez = new T();

        try
        {
            using (Stream stream = File.Open(filePath, FileMode.Open))
            {
                BinaryFormatter bin = new BinaryFormatter();
                rez = (T) bin.Deserialize(stream);
            }
        }
        catch (IOException)
        {
        }

        return rez;
    }
}
Run Code Online (Sandbox Code Playgroud)