DataContractSerializer - 将字符串序列化为值而不是引用

问题描述 投票:0回答:1

我使用

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

c# datacontractserializer
1个回答
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>
© www.soinside.com 2019 - 2024. All rights reserved.