2011-01-23 95 views
3

根據MSPRESS書(MCTS的考試70-536 .NET 2.0):反序列化對象的新成員

你可能有版本的兼容性問題,如果你曾經嘗試反序列化已經序列化的對象您的應用程序的早期版本。具體來說,如果您將成員添加到自定義類並試圖反序列化缺少該成員的對象,則運行時將引發異常。換句話說,如果您將某個成員添加到應用程序3.1版中的某個類中,它將無法反序列化由應用程序3.0版創建的對象。

Now ...和我一樣好奇,我創建了一個項目,序列化了一個類,添加了一個新成員,並嘗試將該類反序列化爲新對象。令我驚訝的是,它的工作原理和新創建的成員默認設置爲空(即使它有另一個默認值)。

我首先嚐試添加一個字符串作爲新成員,看到工作,然後我改變它到另一個自定義類,它仍然工作。

mspress錯了嗎?或者這種行爲是否可定製?

請注意,我是不是使用XML序列化。我正在使用BinaryFormatter序列化。

+0

你使用了哪種序列化?AFAIK一些形式像二進制有這個問題,而其他形式如XML不。 – Mehrdad 2011-01-23 20:37:32

+0

我正在使用BinaryFormatter序列化。 – PedroC88 2011-01-23 20:57:49

回答

1

我一直運行系列化測試,來到同意@Mehrdad關於一些序列化過程支持現在有新成員的反序列化對象(儘管他說的是反向)。

就像Marc Gravell解釋的,BinaryFormatter序列化似乎確實支持Version Tolerant反序列化,我還測試了它可以使用XMLSerialization。請注意,XMLSerialization僅對公共成員進行序列化和反序列化。

SoapFormatter另一方面不支持這種類型的行爲,並且在用新添加的成員反序列化對象時會引發異常。

我還沒有運行過自定義序列化的測試,但由於它的本質,目的和設計,它也應該是它自己的版本。

我認爲,只是爲了安全起見,您應該始終使用[OptionalField]屬性。

2

Mspress說的相反。序列化這個類,刪除一個成員,反序列化,這是行不通的。基本上它會讀取流中的成員,並在找不到時拋出異常。其他方式不關心是否有字段不在流中。

2

BinaryFormatter是(坦率地說)很挑剔,但加入version tolerant serialization - 在想法是簡單地添加[OptionalField]到您預計空這些字段。

但是,如果你說它反序列化爲空,也許這證明太痛苦了,而且它們暗淡地使默認行爲成爲「可選」。

注意的BinaryFormatter的許多弱點(加上一個事實,即它不是獨立於平臺)是爲什麼我只是不使用它; p