所以,我有一个基础项目和几个修改版本。 BaseProject 包含类 BaseClass ,
namespace BaseProject.SomeClasses{
public abstract class BaseClass{
//...
}
}
虽然每个版本都包含 BaseClass 的几个继承者 - f.e。 ProjectOne :
namespace BaseProject.VersionOne.SomeClasses{
public class InheritorClass : BaseClass{
//Some logic here...
}
}
和 ProjectTwo :
namespace BaseProject.VersionTwo.SomeClasses{
public class InheritorClass : BaseClass{
//Some different logic here...
}
}
唯一不同的是名称空间的名称。
基础项目在运行时加载每个程序集并获取所有继承的类型。我需要创建xml文件,该文件应包含两个继承者'实例和一些指向实例应该反序列化的类的指针:
...
<BaseClass xsi:type="InheritorClass"> <!-- From VersionOne -->
<PropOne></PropOne>
<PropTwo></PropTwo>
<PropThree></PropThree>
<!-- ... -->
</BaseClass>
<BaseClass xsi:type="InheritorClass"> <!-- From VersionTwo -->
<PropFour></PropFour>
<PropFive></PropFive>
<PropSix></PropSix>
<!-- ... -->
</BaseClass>
...
有没有办法将这个xml(包含两个版本中的继承实例)反序列化为IEnumerable<BaseClass>
?
答案 0 :(得分:0)
该类的命名空间应该没有区别。请参阅此代码生成的XML文件。
.txt 33
.csv 12
.py 10
.png 8
4
.json 2
.class 1
.c 1
.pl 1
.exe 1
.java 1
.sh 1
答案 1 :(得分:0)
您需要将[XmlTypeAttribute(name)]
属性应用于派生类,以消除xst:type
名称的歧义:
namespace BaseProject.VersionOne.SomeClasses
{
[XmlType("VersionOneInheritorClass")]
public class InheritorClass : BaseClass
{
public string VersionOneProperty { get; set; } // For instance
}
}
和
namespace BaseProject.VersionTwo.SomeClasses
{
[XmlType("VersionTwoInheritorClass")]
public class InheritorClass : BaseClass
{
public string VersionTwoProperty { get; set; } // For instance
}
}
然后您的XML将如下所示,并且可以成功序列化和反序列化而不会丢失信息:
<BaseClass xsi:type="VersionOneInheritorClass"> <VersionOneProperty>one</VersionOneProperty> </BaseClass> <BaseClass xsi:type="VersionTwoInheritorClass"> <VersionTwoProperty>two</VersionTwoProperty> </BaseClass>
顺便说一句,如果您使用XmlSerializer (Type, Type[])
构造函数构建XmlSerializer
以添加已发现的派生类型,则必须cache the serializer in a static cache somewhere,否则您将遇到可怕的资源泄漏