【问题标题】:Deserialize Inherited class with DataContractSerializer(typeof(BaseClass))使用 DataContractSerializer(typeof(BaseClass)) 反序列化继承的类
【发布时间】:2012-01-11 09:57:26
【问题描述】:

在我的 Silverlight 4 应用程序中,我使用 DataContractSerializer 序列化/反序列化数据。我可以有两种不同类型的数据:EditorModel 和 ConfiguratorModel。两种模型都继承自一个公共基类。

[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。我找到了由 Marc Gravell 回答的this stackoverflowquestion,据我所知,当它知道继承的类型时,我可以使用基类(确实如此,请参阅 DTO_ServiceModelBase 的 KnownType-Declaration)。

不过,当我进行以下反序列化时(我还添加了两个继承类型作为第二个参数):

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

它抛出一个异常,因为它需要“ServiceModel”但找到了“ServiceModelEditor”。有什么我忘记了,还是我把 Marc 的回答弄错了?

提前致谢,
弗兰克

【问题讨论】:

    标签: c# serialization datacontractserializer


    【解决方案1】:

    你是如何进行序列化的?当您进行序列化时,您必须指定您正在写出基类 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));
    

    【讨论】:

    • 这应该被标记为正确答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多