我可能搞砸了一个设计决定。我没有使用强类型的自定义对象集合,而是使用了通用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
答案 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,然后你将其转换。