DataContractSerializer kullanarak soyut tipli Sözlük serileştirmenin bir yolu var mı? Örneğin
[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; }
}
Ben bu hatayı alıyorum bu
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();
}
}
}
gibi somut sınıfların birini içeren bir sözlük seri hale getirilmeye açmaya
Tipi 'writeObject
çalışırken ConsoleTest .Program + Base 'serileştirilemez. DataContractAttribute özniteliğiyle işaretini işaretleyin ve DataMemberAttribute özniteliği ile serileştirilmesini istediğiniz tüm üyelerini işaretleyin. Tür bir koleksiyon ise, CollectionDataContractAttribute ile işaretlemeyi düşünün. Desteklenen diğer türler için Microsoft .NET Framework belgelerine bakın.
Bunu çözmenin bir yolu var mı?
DÜZENLEME: ....
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization;
using System.Xml;
sınıfları Ayrıca temel sınıf üzerinde KnownType kullanarak denedik ama kullanan ...
[DataContract]
[KnownType(typeof(concreteClass1))]
[KnownType(typeof(concreteClass2))]
public abstract class BaseClass
{
public abstract string id { get; set; }
}
Aşağıdaki kod satırında TL nedir ?: serializer.WriteObject (yazar, TL) ; – iCode
@iCode yazım hatası – erotavlas
Bunu açıklığa kavuşturmak için gerekli olduğunu düşündüm. Kodunuzu bir test projesinde kopyaladım ... Konsola xmlString yazmak için bir kod satırı ekledim ve benim için çalıştı. XML'i buraya yapıştırmak istemedim ama işe yaradı. Kullanmaya çalışırken (var sw = new StringWriter()) kod bloğunu sarmalamayı deneyin ve istisna ayrıntılarını görüntüleyin. – iCode