我使用DataContract
序列化程序来序列化我的数据。我使用PreserveObjectReferences = true
因为我需要它。
我有两个对象,例如:
[Datacontract]
class A
{
[DataMember] string _name;
...
public A(string name)
{
_name = name;
}
}
和
[Datacontract]
class B
{
[DataMember] string _name;
...
public B(string name)
{
_name = name;
}
}
两者都有_name
字段。
然后我创建A和B的实例,其中我用作对象A中相同名称的第二个对象的名称:
var obj1 = new A("John");
var obj2 = new B(obj1.Name);
然后我序列化它,XML包含:
...
<d11p1:_name z:Id="505">John</d11p1:_name>
..
<d11p1:_name z:Ref="505" i:nil="true" />
因此第二个对象的字段_name
被序列化为引用而不是值。
然后我不需要对象A所以我删除它。但我希望能够打开一个包含A类数据的旧保存文件,但在我的程序的新版本中,我不再需要A类了。
问题是DataContractSerializer
无法反序列化B的实例,因为它的_name
是对A的_name
的引用,它没有被反序列化(类被删除)。
有没有办法强制DataContractSerializer
将字符串序列化为值类型而不是引用?
我知道一个解决方案不是删除A类,而是包含大量数据,这些数据在我的程序的新版本中并不重要。
答案 0 :(得分:1)
不幸的是,这就是PreserveObjectReferences
的工作方式。
您可以尝试使用[DataContract(IsReference = true)]
代替PreserveObjectReferences
。它仅适用于参考类型。
包含列表
的序列化对象<M1 z:Id="i2">
<name>name1</name>
</M1>
<M2 z:Id="i3">
<name>name1</name>
</M2>
<M3 z:Ref="i3"/>
<list>
<m2 z:Ref="i3"/>
<m2 z:Id="i4">
<name i:nil="true"/>
</m2>
</list>