DataContractSerializer、KnownTypeと継承
-
19-09-2019 - |
質問
私は、既知のタイプについての多くの記事を読んでいると私は私の例が動作するはず信じて。しかし、それはしていません。私は、逆シリアル化の次の例外を取得しています、その理由を理解していない。
の行でエラーが発生しました1位2 HTTP」名前空間から要素 'A' を期待://スキーマ.datacontract.org / 2004/07 / ConsoleApplication2 の '..発生しました '' 名前の '要素C'、名前空間' <のhref = "http://schemas.datacontract.org/2004/07/ConsoleApplication2" REL = "noreferrer"> http://schemas.datacontract.org/2004/07/ConsoleApplication2 の」ます。
using System;
using System.Runtime.Serialization;
using System.Xml;
using System.IO;
namespace ConsoleApplication2
{
[DataContract][KnownType(typeof(C))]class A { }
[DataContract]class C : A { }
class Program
{
static void Main(string[] args)
{
A a = new C();
string data;
var serializer = new DataContractSerializer(a.GetType());
using (var sw = new StringWriter())
{
using (var xw = new XmlTextWriter(sw))
serializer.WriteObject(xw, a);
data = sw.ToString();
}
serializer = new DataContractSerializer(typeof(A));
using (var sr = new StringReader(data))
using (var xr = new XmlTextReader(sr))
a = (A)serializer.ReadObject(xr);
}
}
}
私は何をしないのですか?
解決
あなたはシリアライザを作成する方法を変更。使用します:
var serializer = new DataContractSerializer(typeof(A));
の代わりにa.GetTypeの();
これは動作します。生成されたXMLは異なっている - このようなものだっます:
<C> ...
となりました。
<A i:type="C"> ...
所属していません StackOverflow