[DataContract]
public abstract class BaseClass
{
public abstract string id { get; set; }
}
[DataContract(Name = "class1")]
public class concreteClass1 : BaseClass
{
public concreteClass1() { }
[DataMember]
public override string id { get; set; }
[DataMember]
public string prop1 { get; set; }
[DataMember]
public string prop2 { get; set; }
}
[DataContract(Name = "class2")]
public class concreteClass2 : BaseClass
{
public concreteClass2() { }
[DataMember]
public override string id { get; set; }
[DataMember]
public string prop1 { get; set; }
[DataMember]
public string prop2 { get; set; }
}
Wenn ich versuche, ein Wörterbuch enthält eine der konkreten Klassen wie diese
static public void Main(string[] args){
Dictionary<string, BaseClass> items = new Dictionary<string, BaseClass>();
items.Add("1", new concreteClass1() { id = "1", prop1 = "blah1" });
items.Add("11", new concreteClass1() { id = "11", prop1 = "blah11" });
var serializer = new DataContractSerializer(items.GetType());
string xmlString = string.Empty;
using (var sw = new StringWriter())
{
using (var writer = new XmlTextWriter(sw))
{
writer.Formatting = System.Xml.Formatting.Indented;
serializer.WriteObject(writer, items);
writer.Flush();
xmlString = sw.ToString();
}
}
}
ich diesen Fehler serialisiert werden, wenn zu Writeobject versuchen
Typ ‚ConsoleTest .Program + Base 'kann nicht serialisiert werden. Markieren Sie mit dem DataContractAttribute-Attribut und markieren Sie alle Elemente, die mit dem DataMemberAttribute-Attribut serialisiert werden sollen. Wenn es sich bei dem Typ um eine Sammlung handelt, sollten Sie sie mit dem Attribut CollectionDataContractAttribute markieren. Weitere unterstützte Typen finden Sie in der Microsoft .NET Framework-Dokumentation .
Gibt es eine Möglichkeit, dies zu lösen?
EDIT: Ich habe auch versucht Knowntype auf der Basisklasse verwenden, aber es nicht
[DataContract]
[KnownType(typeof(concreteClass1))]
[KnownType(typeof(concreteClass2))]
public abstract class BaseClass
{
public abstract string id { get; set; }
}
Was ist TL in der folgenden Codezeile? serializer.WriteObject (writer, TL) ; – iCode
@iCode Tippfehler sorry – erotavlas
Ich dachte, es war aber notwendig, um zu klären. Ich habe Ihren Code in ein Testprojekt kopiert ... Ich habe eine Codezeile hinzugefügt, um den xmlString in die Konsole zu schreiben, und er hat für mich funktioniert. Ich wollte das XML hier nicht kopieren, aber es hat funktioniert. Versuchen Sie, den Codeblock using (var sw = new StringWriter()) in einen try catch einzufügen und Details zur Ausnahme anzuzeigen. – iCode