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