我使用
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 类,但它包含大量数据,这些数据在我的程序的新版本中并不重要。
不幸的是,这就是
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>