XML版本特定的反序列化

时间:2015-06-02 18:13:20

标签: c# xml serialization xmlserializer

所以,我有一个基础项目和几个修改版本。 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>

2 个答案:

答案 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,否则您将遇到可怕的资源泄漏