我得到了一个模型列表,这些模型可能会有所不同,并且在编译时无法识别它们的类型。我实现此集合的唯一选择是通过制作List<Object>
或List<dynamic>
(我知道第一个更快更好)。问题是,在尝试序列化此集合时,.Net的XmlSerializer
会抛出一个异常,说明&#34;编译时类型未知的数据无法序列化&#34;。问题是,根据这个例外,它是否有可能做到这一点,如果是的话,如何才能有效地完成。
更新
二进制序列化不是一个选项(不能使用它)
答案 0 :(得分:2)
(注意:下面的早期评论引用了与早期版本问题不同的解决方案。)
你试过这个吗?
var types = theList.Select(o => o.GetType()).Distinct().ToArray();
var serializer = new XmlSerializer(typeof(List<object>), types);
...
当然,反序列化会更难;您需要从XML中解析必要的类型,然后使用反射将类型对象转换为数组,以便您可以实例化XmlSerializer。您可以通过使用列出必要类型的元数据打包XML来进行简化。
答案 1 :(得分:0)
在项目后序列化列表项,如:
public class ModelA
{
public int Foo { get; set; }
}
public class ModelB
{
public string Bar { get; set; }
}
class Program
{
static void Main(string[] args)
{
var stream = new MemoryStream();
var writer = XmlWriter.Create(stream);
var list = new List<object>()
{
new ModelA() { Foo = 9 },
new ModelB() { Bar = "some string" }
};
writer.WriteStartElement("root");
list.ForEach(x => ToXml(x, writer));
writer.WriteEndElement();
writer.Flush();
stream.Seek(0, SeekOrigin.Begin);
var doc = new XmlDocument();
doc.Load(XmlReader.Create(stream));
Console.WriteLine(doc.OuterXml);
Console.ReadLine();
}
private static void ToXml(object obj, XmlWriter writer)
{
var serializer = new XmlSerializer(obj.GetType());
serializer.Serialize(writer, obj);
}
}