我有一个课程,我不想再使用了。我已经创建了一个基类,并使我的过时类成为新基类的一个子类。
数据方面,两个类之间的唯一区别是单个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; }
}
答案 0 :(得分:0)
好吧,我用你的对象执行了以下代码:
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
也许您需要显示序列化代码以添加更多细节。