如何强制XML反序列化到相同名称的派生类型?

时间:2012-06-19 06:21:37

标签: c# serialization xml-serialization deserialization

我在库中提供的类型我无法修改,例如:

namespace BaseNamespace
{
    public class A
    {
        public string Foo { get; set; }
    }
}

我还有一个名为SomeOtherNamespace.A的类,它源自BaseNamespace.A,如下所示:

namespace SomeOtherNamespace
{
    public class A : BaseNamespace.A
    {
        public string DoSomething() {}
    }
}

在Web服务中,我收到了一个XML有效负载。

我想反序列化XML,以便最终得到一个SomeOtherNamespace.A对象。但是当我运行以下代码时

string xml = "<A Foo=\"test\"></A>";

XmlSerializer serializer = new XmlSerializer(typeof(A));

StringReader reader = new StringReader(xml);

A obj = serializer.Deserialize(reader) as A;

我收到错误:

  

类型'BaseNamespace.A'和'SomeOtherNamespace.A'都使用XML   类型名称,'A',来自命名空间''。使用XML属性指定   该类型的唯一XML名称和/或命名空间。

问题:如果不修改类BaseNamespace.A,如何强制反序列化到派生类型SomeOtherNamespace.A?

2 个答案:

答案 0 :(得分:1)

将您的SomeOtherNamespace.A重命名为

namespace SomeOtherNamespace
{
    public class AAA : BaseNamespace.A
    {
        public string DoSomething() {}
    }

}

并将序列化器创建为

XmlRootAttribute root = new XmlRootAttribute("A");
XmlSerializer serializer = new XmlSerializer(typeof(AAA),root);

答案 1 :(得分:0)

如果可以在Xml中为SomeOtherNamespace.A使用不同的名称,则可以使用XmlTypeAttribute为A提供不同的Xml类型。

namespace SomeOtherNamespace {
    [XmlType("NotA")]
    public class A
    {
        public string Foo { get; set; }
    }
}

更重要的是,您可能需要考虑一种设计,其中派生类与基类的名称不同。