[英]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.