接口属性的XML序列化

我想XML序列化一个对象,该对象具有(以及其他)IModelObject类型的属性(这是一个接口)。


public class Example

{

    public IModelObject Model { get; set; }

}

当我尝试序列化此类的对象时,我收到以下错误:

“无法序列化示例类型的Example.Model,因为它是一个接口。”


我知道问题是接口无法序列化。但是,具体的Model对象类型在运行时才会被识别。


用抽象或具体类型替换IModelObject接口并使用XMLInclude的继承是可能的,但似乎是一个丑陋的解决方法。


有什么建议么?


温温酱
浏览 533回答 3
3回答

慕雪6442864

解决方法是使用DataContractSerializer进行反射。您甚至不必使用[DataContract]或[DataMember]标记您的类。它将序列化任何对象,无论它是否具有接口类型属性(包括字典)到xml中。这是一个简单的扩展方法,它将任何对象序列化为XML,即使它有接口(注意你可以调整它以便递归运行)。    public static XElement ToXML(this object o)    {        Type t = o.GetType();        Type[] extraTypes = t.GetProperties()            .Where(p => p.PropertyType.IsInterface)            .Select(p => p.GetValue(o, null).GetType())            .ToArray();        DataContractSerializer serializer = new DataContractSerializer(t, extraTypes);        StringWriter sw = new StringWriter();        XmlTextWriter xw = new XmlTextWriter(sw);        serializer.WriteObject(xw, o);        return XElement.Parse(sw.ToString());    }LINQ表达式的作用是枚举每个属性,返回作为接口的每个属性,获取该属性的值(底层对象),获取该具体对象的类型将其放入数组中,并将其添加到序列化程序中已知类型列表。现在,序列化器知道它序列化的类型如何,它可以完成它的工作。
打开App,查看更多内容
随时随地看视频慕课网APP