繁体   English   中英

序列化强类型对象列表

[英]Serializing a list of strongly typed objects

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

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<> (或者我可以吗?),我将不得不序列化列表中的每个项目。

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

你需要一个包装器 class; 然后按照您的示例序列化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; }
}

您可以序列化 List<>。 在这里阅读我使用的属性。

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

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

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

因此,对泛型类型的对象进行序列化和反序列化是一件轻而易举的事。 它反序列化为列表,然后您将其转换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM