ile Inherited sınıfını DataContractSerializer ile seri hale getirin. İki farklı veri türüne sahip olabilirim: EditorModel ve ConfiguratorModel. Her iki model ortak bir ana sınıftan miras alır.Deserialize Silverlight 4 uygulamasında DataContractSerializer (typeof (BaseClass))
[DataContract(IsReference = true, Name = "ServiceModel", Namespace = "ServiceModeller.DataModel.Serialization")]
[KnownType(typeof(DTO_ServiceModelEditor))]
[KnownType(typeof(DTO_ServiceModelConfigurator))]
public abstract class DTO_ServiceModelBase { ... }
[DataContract(IsReference = true, Name = "ServiceModelEditor", Namespace = "ServiceModeller.DataModel.Serialization")]
public class DTO_ServiceModelEditor : DTO_ServiceModelBase { ... }
[DataContract(IsReference = true, Name = "ServiceModelConfigurator", Namespace = "ServiceModeller.DataModel.Serialization")]
public class DTO_ServiceModelConfigurator : DTO_ServiceModelBase { ... }
Seri hale getirme sorun değildir ve amaçlandığı şekilde çalışır. Serileştirdiğimde, belirli kalıtsal sınıfı adlandırmak istemiyorum çünkü kullanıcı EditorModel veya ConfiguratorModel'ı da yükleyebilir. Marc Gravell tarafından yanıtlanan this stackoverflowquestion'u buldum ve anladığım kadarıyla, miras alınan türleri bildiği zaman temel sınıfı kullanabilirim (ki bunu yapar, DTO_ServiceModelBase'de KnownType-Declaration'a bakın). Aşağıdaki deserialization yaptığınızda
Yine de, (Ben de ikinci parametre olarak hem kalıtsal tipleri eklendi): Bu "ServiceModel" beklediğini ancak "ServiceModelEditor" bulduğu için
DataContractSerializer serializer = new DataContractSerializer(typeof(DTO_ServiceModelBase), new Type[] {typeof(DTO_ServiceModelEditor), typeof(DTO_ServiceModelConfigurator)});
System.Xml.XmlReader reader = System.Xml.XmlReader.Create(new System.IO.StringReader(stream));
// stream is the serialized string
object result;
try
{
result = serializer.ReadObject(reader);
}
catch (Exception ex)
{ .. }
Bu bir istisna atar. Unuttuğum bir şey var mı, yoksa Marc'ın cevabını yanlış mı anladım? peşin
sayesinde
Frank
Bunun günümüze Doğru cevap olarak işaretlendi. –