通过创建新基类并废弃派生类来移除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; }
}
好吧,我用您的对象执行了以下代码:
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
也许您需要显示序列化代码以添加更多细节。