序列化在编译时类型未知的Object

时间:2015-02-18 23:29:20

标签: c# serialization

我得到了一个模型列表,这些模型可能会有所不同,并且在编译时无法识别它们的类型。我实现此集合的唯一选择是通过制作List<Object>List<dynamic>(我知道第一个更快更好)。问题是,在尝试序列化此集合时,.Net的XmlSerializer会抛出一个异常,说明&#34;编译时类型未知的数据无法序列化&#34;。问题是,根据这个例外,它是否有可能做到这一点,如果是的话,如何才能有效地完成。

更新

二进制序列化不是一个选项(不能使用它)

2 个答案:

答案 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);
    }
}