2015-05-04 46 views
2

我使用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類,而是包含很多在我的程序的新版本中不重要的數據。

+0

序列化對象是B您已經創建了新的類?你可以修改B類嗎? – danish

+0

不是班級B也是舊版本的程序。正如我所寫的那樣,它被序列化爲XML文件。它在新版本的程序中是必需的。新版本的程序必須讀取舊程序保存的文件。 B類的變化是什麼意思? – Philipe

+0

我的意思是如果可以對B類中的代碼進行更改。由於您已經指示序列化程序來保存引用,它將會。 – danish

回答

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> 
+0

所以你的意思是不要爲所有對象使用PreserveObjectReferences,而只能爲我自己的類使用PreserveObjectReferences。所以字符串將被排除。但是像其他系統引用像數組呢?我有我的數據樹(我整個序列化)由大約50個類組成,一些類可以共享相同的數組。所以,如果我只爲我的類使用PreserveObjectReferences,那麼examle數組將作爲兩個不同的實例創建。 – Philipe

+0

如果您的數組包含參考類型,則它將顯示爲僅參考。 (post edited) – sac1

+0

我的意思是例如兩個具有相同數組的對象:
class M1 { Person [] _list; public M1(Person [] list) { _list = list; } } 和相同的類M2和我將創建它們與相同的數組(參考) – Philipe

相關問題