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

时间:2015-05-04 09:27:57

标签: c# datacontractserializer

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

1 个答案:

答案 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>