我使用DataContract
序列化程序来序列化我的数据。我使用PreserveObjectReferences = true
,因为我需要它。 我有例如两个对象:DataContractSerializer - 将字符串序列化为值而不是引用
[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
场。 然后,我创建了一个实例和B,其中我的第二个对象从对象的名称相同的名称使用:
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
被序列化为引用而不是Value。
然后我不需要对象A,所以我删除它。但我希望能够打开一个包含A类数据的旧保存文件,但在我的程序的新版本中,我不再需要类A了。
问题是DataContractSerializer
不能反序列化B的实例,因为它的_name
是对未反序列化(类被删除)的_name
的引用。
有什么办法可以强制DataContractSerializer
将字符串序列化为值类型而不是引用?
我知道一种解决方案不是删除A类,而是包含很多在我的程序的新版本中不重要的数据。
序列化对象是B您已经创建了新的类?你可以修改B类吗? – danish
不是班级B也是旧版本的程序。正如我所写的那样,它被序列化为XML文件。它在新版本的程序中是必需的。新版本的程序必须读取旧程序保存的文件。 B类的变化是什么意思? – Philipe
我的意思是如果可以对B类中的代码进行更改。由于您已经指示序列化程序来保存引用,它将会。 – danish