我在库中提供的类型我无法修改,例如:
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?
答案 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; }
}
}
更重要的是,您可能需要考虑一种设计,其中派生类与基类的名称不同。