DataContractSerializer, Knowntype und Vererbung
-
19-09-2019 - |
Frage
Ich habe viele Artikel über bekannte Typen lesen und i belive sollte mein Beispiel arbeiten. Aber es funktioniert nicht. Ich erhalte die folgende Ausnahme auf Deserialisierung und verstehe nicht, warum:
Fehler in Zeile 1 Position 2 Expecting Element 'A' von Namespace ‚ http: // Schema .datacontract.org / 2004/07 / ConsoleApplication2 '.. Findet 'Element' mit dem Namen 'C', Namespace' 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);
}
}
}
Was bin ich fehlt?
Lösung
Ändern Sie die Art und Weise Sie Serializer erstellen. Verwendung:
var serializer = new DataContractSerializer(typeof(A));
statt a.GetType ();
Es funktioniert. Der XML-Code, erzeugt wird, ist anders - war so etwas wie folgt aus:
<C> ...
und jetzt ist:
<A i:type="C"> ...
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow