2011-12-02 19 views
6

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

cevap

5

nasıl seri yapıyorsun? Seri hale getirdiğinizde, DTO_ServiceModelBase temel sınıfının nesnelerini yazdığınızı belirtmeniz gerekir ve daha sonra çalışması gerekir. Eğer serialising yaparken Dolayısıyla, sadece deserialisation örnekte olduğu gibi DataContractSerialiser aynı şekilde tanımlayın:

DataContractSerializer serializer = new DataContractSerializer(typeof(DTO_ServiceModelBase), new Type[] {typeof(DTO_ServiceModelEditor), typeof(DTO_ServiceModelConfigurator)}); 

hata itibaren yerine böyle bir şey yaptık sanki görünür:

DataContractSerializer serializer = new DataContractSerializer(typeof(DTO_ServiceModelEditor)); 
+1

Bunun günümüze Doğru cevap olarak işaretlendi. –

İlgili konular