c#中混合类型对象列表的XmlSerialization
本文关键字:列表 XmlSerialization 对象 类型 混合 | 更新日期: 2023-09-27 18:13:50
我想序列化List<object>
包含我写的特定类。
public static void Main(string[] args)
{
List<object> ListToSerialize = new List<object>();
ListToSerialize.Add(new CustomeClass());
ListToSerialize.Add("");
ListToSerialize.Add(2);
ListToSerialize.Add(new int[] { 7, 8, 6 });
XmlSerializer xmlSerializer = new XmlSerializer(ListToSerialize.GetType());
StringWriter stringWriter = new StringWriter();
using (var xmlWriter = XmlWriter.Create(stringWriter))
{
xmlSerializer.Serialize(xmlWriter, ListToSerialize);
}
string Res = stringWriter.ToString();
}
[Serializable]
public class CustomeClass
{
}
i got error:生成XML文档时出错。类型New。CustomeClass没有被期望。使用XmlInclude或SoapInclude属性来指定静态未知的类型。
还实现了IXmlSerializable
接口。
[Serializable]
public class CustomeClass : IXmlSerializable
{
public System.Xml.Schema.XmlSchema GetSchema()
{
throw null;
}
public void ReadXml(System.Xml.XmlReader reader)
{
}
public void WriteXml(System.Xml.XmlWriter writer)
{
writer.WriteString("1");
}
}
and I got bellow error:
类型为New。CustomeClass不能在这个上下文中使用。使用New。CustomeClass作为类或结构的参数、返回类型或成员时,参数、返回类型或成员必须声明为New类型。CustomeClass(它不能是对象)。类型为New的对象。CustomeClass不能用于无类型集合,如ArrayLists。
它的工作,当我使用List<CustomeClass>
,但我需要它是List<object>
。谢谢你的帮助
虽然我绝对建议不要使用这种代码,但您可以使用XmlSerializer
构造函数重载,它接受其他类型的Type[]
。From XmlSerializer Constructor
:
初始化XmlSerializer类的一个新实例将指定类型的对象序列化为XML文档将XML文档反序列化为指定类型的对象。如果一个属性或字段返回一个数组,extraTypes参数指定可插入到数组中的对象。
像这样使用:
public static void Main(string[] args)
{
List<object> ListToSerialize = new List<object>();
ListToSerialize.Add(new CustomeClass());
ListToSerialize.Add("");
ListToSerialize.Add(2);
ListToSerialize.Add(new int[] { 7, 8, 6 });
XmlSerializer xmlSerializer = new XmlSerializer(ListToSerialize.GetType(), new[]
{ typeof(int}, typeof(int[]), typeof(string), typeof(CustomeClass) });
StringWriter stringWriter = new StringWriter();
using (var xmlWriter = XmlWriter.Create(stringWriter))
{
xmlSerializer.Serialize(xmlWriter, ListToSerialize);
}
string Res = stringWriter.ToString();
}
如果删除IXmlSerializable接口,它可以工作。知道这个解决方案增加了时间复杂度是很有用的。