我有一个接口,目前有两个类实现。从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属性,然后根据它进行序列化吗?
答案 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; }
}