使用接口进行XmlSerialisation的策略?

时间:2009-03-16 16:43:39

标签: c# xml-serialization interface

我有一个接口,目前有两个类实现。从xml文件中读取这些类的数据。

e.g。

[Serializable]
public interface IMyInterface { }

[Serializable]
public class MyClass1 : IMyInterface { }

[Serializable]
public class MyClass2 : IMyInterface { }

我想从Xml中推断出类型,有没有办法呢?

所以例如我的xml看起来像这样:

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

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

编辑:为了澄清,我知道如何序列化,但我无法在不知道它是哪种类型的情况下序列化。我应该读取type属性,然后根据它进行序列化吗?

4 个答案:

答案 0 :(得分:1)

如果您使用的是XmlSerializer,则可以添加XmlIncludeAttribute以指定可以反序列化的派生类。但问题是你必须将它添加到 base 类:

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

public class DerivedClass : BaseClass
{
    public override bool Property { get; set; }
}

其他方法是为可以派生的成员实现IXmlSerializable,然后根据属性为派生类创建一个Factory(或者你现在正在做什么?)

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

如果我理解你的查询......

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

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

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

如果要反序列化(XML回到具体对象),则将其反序列化为IMyInterface,检查对象区分符,并相应地进行转换。

答案 3 :(得分:-1)

我不知道这是否有所帮助,但这里有......

如果将公共属性放在返回typename

的类上,该怎么办?
[XmlAttribute]
public string Type {
    get { return GetType().Name; }
}