gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:08:19 25 4
gpt4 key购买 nike

我使用 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>

关于c# - DataContractSerializer - 将字符串序列化为值而不是引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30026736/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com