2011-12-02 12 views
6

で継承されたクラスを逆シリアル化し、DataContractSerializerでデータをシリアル化/逆シリアル化します。私は2つの異なるタイプのデータを持つことができます:EditorModelとConfiguratorModel。どちらのモデルも共通のベースクラスを継承しています。Silverlight 4アプリケーションで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 { ... } 

シリアライズは問題なく動作します。私が逆シリアル化するとき、ユーザーはEditorModelまたはConfiguratorModelも読み込むことができるので、特定の継承クラスに名前を付けたくありません。私はthis stackoverflowquestion、Marc Gravellによって答えられました。私が理解しているように、継承された型を知っているときは基本クラスを使用できます(DTO_ServiceModelBaseのKnownType-Declarationを参照)。私は、次の逆シリアル化を行うとき

はまだ、(私も2番目のパラメータとして、両方の継承されたタイプを追加しました):それは「ServiceModel」を期待していますが、「ServiceModelEditor」を見つけたので

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) 
{ .. } 

それは、例外がスローされます。私が忘れてしまったことはありますか、またはマークの答えが間違っていましたか?事前に

おかげで、
フランク

答えて

5

はどのようにシリアライズしてるの?シリアル化しているときは、基本クラスDTO_ServiceModelBaseのオブジェクトを書き出していることを指定する必要があります。だから、あなただけDataContractSerialiserあなたのデシリアライゼーションの例と同じ方法を定義する直列化しているとき:

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

あなたの代わりにこのような何かをやったかのように見えるエラーから:

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

これがなければなりません正解とマークされています。 –

関連する問題