如何序列化列表<t>?</t>

时间:2011-02-15 15:50:47

标签: c# xml list serialization

我有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
}

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

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

有什么好的选择呢? 感谢

7 个答案:

答案 0 :(得分:9)

您可以使用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();

为了使其正常工作,您还需要对类型进行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; } 
}

修改

默认情况下,

Enum属性被序列化,属性名称包含XML元素,其枚举值为XML值,即示例中的属性NotSystem是否具有值{{1}它会被序列化为

C

当然,您可以通过执行正确的注释来更改属性序列化的方式,即使用<NotSystem>C</NotSystem> 将其序列化为属性,或[XmlAttribute],以便使用[XmlElement("Foobar")]对其进行序列化作为元素名称。有关MSDN的更多文档,请查看上面的链接。

答案 1 :(得分:5)

一种简便的方法,可以对任何对象进行 binary 序列化,并捕获IO错误。

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

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

//Deserialization
asdf = Serializer.Load<List<Cookie>>("data.bin");

序列化器类:

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

答案 2 :(得分:1)

你可以用这个

 [XmlArray("array_name")]
 [XmlArrayItem("Item_in_array")]
 public List<T> _List; 

答案 3 :(得分:1)

    public IList<Object> Deserialize(string a_fileName)
    {
        XmlSerializer deserializer = new XmlSerializer(typeof(List<Object>));

        TextReader reader = new StreamReader(a_fileName);

        object obj = deserializer.Deserialize(reader);

        reader.Close();

        return (List<Object>)obj;
    }

    public void Serialization(IList<Object> a_stations,string a_fileName)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(List<Object>));

        using (var stream = File.OpenWrite(a_fileName))
        {
            serializer.Serialize(stream, a_stations);
        }
    }

答案 4 :(得分:0)

您是否需要使用XML作为表示?您可能还需要考虑二进制表示,这通常更快,更紧凑。您拥有内置的BinaryFormatter,或者更好的是您可以使用快速且超紧凑的protocol buffers。 如果您需要XML,您可能需要考虑是否要支持某种与其他语言和技术甚至平台的互操作性。如果它只是C#到c#,则Xml的XmlSerializer或BinaryFormatter都可以。如果您要与Javascript交互,您可以考虑使用JSON(您可以尝试JSON.NET。 此外,如果您想要支持Windows Phone或其他更受限制的设备,使用适用于任何地方的XmlSerializer可能会更容易。

最后,您可能更喜欢只拥有一个通用基础架构并支持许多序列化机制和传输。 Microsoft在WCF中提供了一个很棒的(虽然有点慢)解决方案。也许如果您对系统的要求有更多说明,那么建议实施会更容易。好消息是你有很多选择。

答案 5 :(得分:0)

正如cloudraven建议的那样,您可以使用二进制表示。在寻找解决方案时,我遇到了this链接。 基本上,您将A类标记为[Serializable],B类和C类也是如此。然后,您可以使用these ones等函数来序列化和反序列化

答案 6 :(得分:-1)

JAXB是我用过的最好的。

http://www.oracle.com/technetwork/articles/javase/index-140168.html

来自XML:

QuestionEntity obj = null;
try {
    JAXBContext ctx = JAXBContext.newInstance(QuestionEntity.class);
    Unmarshaller unmarshaller = ctx.createUnmarshaller();
    obj = (QuestionEntity) unmarshaller.unmarshal(new StreamSource(new StringReader(xml)));
} catch (JAXBException e) {
    e.printStackTrace();
}

到XML:

JAXBContext ctx = JAXBContext.newInstance(TestEntity.class);
Marshaller marshaller = ctx.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
StringWriter stringWriter = new StringWriter();
marshaller.marshal(this, stringWriter);
return stringWriter.toString();