通过创建新基类并废弃派生类来移除DataMember

本文关键字:派生 废弃 DataMember 创建 新基类 基类 | 更新日期: 2023-09-27 18:20:47

我有一个类,我不想再使用它了。我创建了一个基类,并使我废弃的类成为新基类的子类。

在数据方面,这两个类之间的唯一区别是单个DataMember属性。

我有一个类的属性引用了属性中的派生类(也称为DataMember)。我已将该类型替换为基本类型。

在反序列化时,我得到错误消息:在流中找不到引用id为"iXX"的反序列化对象。

如果我将DataMember从派生类移动到基类。例外情况消失了。

我知道我不能修改DataContract。我希望创建一个新的类,并允许另一个过时的类随着时间的推移而脱落。

我能做这个吗?为什么会出现此异常?

*编辑:当涉及继承时,xml元素似乎有一个type属性。我猜这就是反序列化失败的原因。

**编辑:

用这个序列化:

[DataContract(IsReference = true)]
public class DerivedType    
{
    [DataMember]
    public Dictionary<object,object> DataMemberThatIDoNotNeed { get; set; }
}
[DataContract(IsReference = true)]
public class Class1
{
    [DataMember]
    //Previously was DerivedType before BaseType was introduced
    public DerivedType MyBaseType { get; set; }      
}

然后,用这个反序列化:

[DataContract(IsReference = true)]
[KnownType(typeof(DerivedType))]
public class BaseType
{
}
[DataContract(IsReference = true)]    
public class DerivedType : BaseType
{
    [DataMember]
    public Dictionary<object,object> DataMemberThatIDoNotNeed { get; set; }
}
[DataContract(IsReference = true)]
public class Class1
{
    [DataMember]
    //Previously was DerivedType before BaseType was introduced
    public BaseType MyBaseType { get; set; }
}

通过创建新基类并废弃派生类来移除DataMember

好吧,我用您的对象执行了以下代码:

var class1 = new Class1 {MyBaseType = new DerivedType()};
var serializer = new DataContractSerializer(typeof (Class1));
serializer.WriteObject(File.Create(filename), class1);

然后我把Class1改成:

[DataContract(IsReference = true)]
public class Class1
{
    [DataMember]
    public DerivedType MyBaseType { get; set; }
}

并且以下代码仍然有效:

var readObject = new DataContractSerializer(typeof (Class1)).ReadObject(File.OpenRead(filename));
readObject.Should().NotBeNull(); // it is not null

也许您需要显示序列化代码以添加更多细节。