为了账号安全,请及时绑定邮箱和手机立即绑定

接口属性的XML序列化

接口属性的XML序列化

温温酱 2019-09-20 14:47:14
我想XML序列化一个对象,该对象具有(以及其他)IModelObject类型的属性(这是一个接口)。public class Example{    public IModelObject Model { get; set; }}当我尝试序列化此类的对象时,我收到以下错误:“无法序列化示例类型的Example.Model,因为它是一个接口。”我知道问题是接口无法序列化。但是,具体的Model对象类型在运行时才会被识别。用抽象或具体类型替换IModelObject接口并使用XMLInclude的继承是可能的,但似乎是一个丑陋的解决方法。有什么建议么?
查看完整描述

3 回答

?
慕雪6442864

TA贡献1812条经验 获得超5个赞

解决方法是使用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表达式的作用是枚举每个属性,返回作为接口的每个属性,获取该属性的值(底层对象),获取该具体对象的类型将其放入数组中,并将其添加到序列化程序中已知类型列表。


现在,序列化器知道它序列化的类型如何,它可以完成它的工作。


查看完整回答
反对 回复 2019-09-20
  • 3 回答
  • 0 关注
  • 532 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信