3

次のように、変更できないライブラリでタイプが提供されています。

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

BaseNamespace.Aから派生したSomeOtherNamespace.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

SomeOtherNamespace.AにXmlで別の名前を使用することが許容される場合は、XmlTypeAttributeを使用してAに別のXmlタイプを指定できます。

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

さらに重要なことに、派生クラスが基本クラスと同じ名前を持たない設計を検討することをお勧めします。

于 2012-06-19T07:36:14.473 に答える