C# 使用DataContractSerializer反序列化继承的类(typeof(BaseClass))

C# 使用DataContractSerializer反序列化继承的类(typeof(BaseClass)),c#,serialization,datacontractserializer,C#,Serialization,Datacontractserializer,在Silverlight 4应用程序中,我使用DataContractSerializer序列化/反序列化数据。我可以有两种不同类型的数据:EditorModel和ConfiguratorModel。两个模型都继承自一个公共基类 [DataContract(IsReference = true, Name = "ServiceModel", Namespace = "ServiceModeller.DataModel.Serialization")] [KnownType(typeof(DTO_

在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回答,据我所知,当基类知道继承的类型时,我可以使用它(它确实知道,请参阅DTO_ServiceModelBase上的KnownType声明)

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

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

提前感谢,

弗兰克

你的连载怎么样?序列化时,必须指定将基类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));

这应该被标记为正确答案。
DataContractSerializer serializer = new DataContractSerializer(typeof(DTO_ServiceModelEditor));