3

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

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?

4

2 回答 2

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);
于 2012-06-19T06:41:41.697 回答
0

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

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

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

于 2012-06-19T07:36:14.473 回答