代码之家  ›  专栏  ›  技术社区  ›  Rob Stevenson-Leggett

使用接口实现XmlSerialization的策略?

  •  0
  • Rob Stevenson-Leggett  · 技术社区  · 15 年前

    我现在有两个类实现的接口。这些类的数据是从xml文件读入的。

    [Serializable]
    public interface IMyInterface { }
    
    [Serializable]
    public class MyClass1 : IMyInterface { }
    
    [Serializable]
    public class MyClass2 : IMyInterface { }
    

    我想从Xml中推断类型,有没有一种方法可以做到这一点?

     <meta type="MyClass1">
       <!--- Some meta data -->
     </meta>  
    

    我希望能够直接将xml序列化为对象。目前我正在手动处理xml。

    编辑:为了澄清,我知道如何序列化输出,但如果不知道它是第一种类型,我就无法序列化回。我应该读取type属性,然后基于它进行序列化吗?

    4 回复  |  直到 15 年前
        1
  •  1
  •   vgru    15 年前

    XmlIncludeAttribute 指定可以反序列化的派生类。但问题是你必须把它添加到 基础 类别:

    [XmlInclude(typeof(DerivedClass))]
    public abstract class BaseClass
    {
        public abstract bool Property { get; set; }
    }
    
    public class DerivedClass : BaseClass
    {
        public override bool Property { get; set; }
    }
    

        2
  •  1
  •   John Saunders    15 年前

    XML序列化程序不适用于这种情况。它用于序列化可以映射到XML模式描述的XML中的对象。

    另一方面,运行时序列化包括一个SOAP格式化程序,它可以序列化对象,包括其.NET类型的详细信息。WCF中的NetDataContractSerializer也是如此。

        3
  •  1
  •   Jason Plank Maksim Kondratyuk    13 年前

    比如说,在你的界面中有一个属性

    [Serializable]
    public interface IMyInterface 
    { 
     YourClassDifferentiatorEnum ObjectDifferentiator { get;  set; }
    }
    

    并让每个类使用不同的枚举值设置此值。将这些具体类序列化为XML。

    IMyInterface ,检查对象微分器,并相应地强制转换。

        4
  •  -1
  •   Jhonny D. Cano -Leftware-    15 年前

    如果在返回typename的类上放置一个公共属性呢

    [XmlAttribute]
    public string Type {
        get { return GetType().Name; }
    }