序列化 .NET中的不可變集合
查看英文原文:Serializing Immutable Collections in .NET
.NET 不可變集合的序列化問題現在非常糟糕。如果你使用 DataMember 屬性標記一個 ImmutableList<T>類型的屬性,那么標準的反序列化器好像會忽略它。沒有運行時錯誤,但是數據就是不存在。
你可以將屬性改為 IList 類型從而防止數據丟失,但是這會導致一個語義問題。盡管你可以將一個不可變列表存儲到一個 IList 中,但是這種做法令人難以接受,因為大多數人心里面都認為一個給定的 IList 不會是只讀的。另外,類型檢查器不能在編譯時捕獲這種錯誤。
為了解決語義錯誤,用戶認為可以提供一個 IReadOnlyList 類型的屬性替代。不幸的是,這樣做會在序列化期間拋出一個異常,除非添加了 KnownType 屬性。但是一旦添加了該屬性在對其序列化時就又會產生無聲的錯誤。
同樣地,傳統的序列化機制(使用 Serializable 屬性)也不支持。Immo Landwerth 寫道:
是的。首先,我們使用的可移植子集(portable subset)不支持二進制序列化(visualstudio.uservoice.com/.../3701316-make-the-new-immutable-collection-types-serializab)。其次,我們喜歡一個能夠在核心數據結構之外實現序列化的模型,因為這樣在客戶端/服務器場景下使用的時候就可以更加有彈性地實現變化、解決跨版本序列化問題。流行的序列化類庫已經計劃為不可變集合增加支持,例如 JSON.NET、protobuf-net。
</blockquote>這樣我們可以選擇第三方類庫,例如 JSON.NET。截至版本 5.0r7,JSON.NET 已經支持 .NET 官方的不可變集合類庫。該版本中的新內容還包括 JsonExtensionData,它會將一個被反序列化類中的所有沒有屬性表示的附加數據存儲起來。
Marc Gravell 還宣稱 protobuf-net 將會支持不可變集合,
protobuf-net(r666)的主干現在已經支持不可變列表(List)、數組(Array)、字典(Dictionary)、哈希集合(Hash-Set)、排序集合(Sorted-Set)、排序字典(Sorted-Dictionary),同時它們的所有接口都有雙份。但是所有內容都在一個單例模式識別塊中。
</blockquote>來自: InfoQ本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!