で継承されたクラスを逆シリアル化し、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)
{ .. }
それは、例外がスローされます。私が忘れてしまったことはありますか、またはマークの答えが間違っていましたか?事前に
おかげで、
フランク
これがなければなりません正解とマークされています。 –