序列化强类型对象列表

时间:2009-03-20 20:38:10

标签: c# asp.net xml

我可能搞砸了一个设计决定。我没有使用强类型的自定义对象集合,而是使用了通用List。基本上,我所拥有的是:

public class AreaFields
{
    [XmlArray("Items")]
    [XmlArrayItem("Item")]
    public List<Fields> Fields { set; get; }

    [XmlAttribute]
    int id { set; get; }
}

public class Fields
{
    [XmlAttribute]
    public string Name { set; get; }
}

在整个应用程序中,我使用了List<AreaFields>现在,我需要将列表序列化为XML。我希望得到的是:

   <SomeXMLTag>
    <AreaFields id='1000'>
     <Items>
       <Item Name="Test1" />
       <Item Name="Test2" />
     </Items>
    </AreaFields>
    <AreaFields id='1001'>
     <Items>
       <Item Name="Test1" />
       <Item Name="Test2" />
     </Items>
    </AreaFields>
    </SomeXMLTag>

由于我无法序列化List&lt;&gt; (或者我可以吗?),我将必须序列化列表中的每个项目。

Ex: List<AreaFields> list = new List<AreaFields>();
//    more code to add to list
    list[0].GetRawXML(); //A method i have to serialize

4 个答案:

答案 0 :(得分:5)

你需要一个包装类;然后序列化MyWrapper的实例以根据您的示例获取xml。

[XmlRoot("SomeXMLTag")]
public class MyWrapper
{
    [XmlElement("AreaFields")]
    public List<AreaFields> AreaFields { get; set; }
}

public class AreaFields
{
    [XmlArray("Items")]
    [XmlArrayItem("Item")]
    public List<Fields> Fields { set; get; }

    [XmlAttribute]
    public int id { set; get; }
}

public class Fields
{
    [XmlAttribute]
    public string Name { set; get; }
}

答案 1 :(得分:4)

您可以序列化List&lt;&gt;。阅读here了解我使用的属性。

答案 2 :(得分:0)

using System;
using System.Collections.Generic;
using System.Xml;
using System.Xml.Serialization;
using System.Text;
using System.IO;

namespace Utils
{
    public class XMLSerializer
    {
        public static Byte[] StringToUTF8ByteArray(String xmlString)
        {
            return new UTF8Encoding().GetBytes(xmlString);
        }

        public static String SerializeToXML<T>(T objectToSerialize)
        {
            StringBuilder sb = new StringBuilder();

            XmlWriterSettings settings = 
                new XmlWriterSettings {Encoding = Encoding.UTF8, Indent = true};

            using (XmlWriter xmlWriter = XmlWriter.Create(sb, settings))
            {
                if (xmlWriter != null)
                {
                    new XmlSerializer(typeof(T)).Serialize(xmlWriter, objectToSerialize);
                }
            }

            return sb.ToString();
        }

        public static void DeserializeFromXML<T>(string xmlString, out T deserializedObject) where T : class
        {
            XmlSerializer xs = new XmlSerializer(typeof (T));

            using (MemoryStream memoryStream = new MemoryStream(StringToUTF8ByteArray(xmlString)))
            {
                deserializedObject = xs.Deserialize(memoryStream) as T;
            }
        }
    }
}

然后,当您要打印列表时,请执行以下操作:

List<AreaFields> list = new List<AreaFields>();
//    more code to add to list
Console.WriteLine(Utils.XMLSerializer.SerializeToXML(areaFields));

编辑:更改了序列化程序以避免其中一个二进制转换。您需要确保所有要序列化的属性都是公共的,并且您有一个不带参数的构造函数。

答案 3 :(得分:-2)

Java泛型按类型擦除工作。这种方式意味着当应用程序实际运行时,JVM不关心泛型。编译器会关注它们,然后将它们从字节码中丢弃(尽管某些注释放在.class文件中等等)

因此,对通用类型的对象进行序列化和反序列化是一种明智之举。它反序列化为List,然后你将其转换。