写点什么

序列化 .NET 中的不可变集合

  • 2013-11-12
  • 本文字数:813 字

    阅读完需:约 3 分钟

.NET 不可变集合的序列化问题现在非常糟糕。如果你使用 DataMember 属性标记一个 ImmutableList类型的属性,那么标准的反序列化器好像会忽略它。没有运行时错误,但是数据就是不存在。

你可以将属性改为 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。

这样我们可以选择第三方类库,例如 JSON.NET。截至版本 5.0r7, JSON.NET 已经支持.NET 官方的不可变集合类库。该版本中的新内容还包括 JsonExtensionData,它会将一个被反序列化类中的所有没有属性表示的附加数据存储起来。

Marc Gravell 还宣称 protobuf-net 将会支持不可变集合

protobuf-net (r666)的主干现在已经支持不可变列表(List)、数组(Array)、字典(Dictionary)、哈希集合(Hash-Set)、排序集合(Sorted-Set)、排序字典(Sorted-Dictionary),同时它们的所有接口都有双份。但是所有内容都在一个单例模式识别块中。

查看英文原文 Serializing Immutable Collections in .NET

2013-11-12 05:121187
用户头像

发布了 321 篇内容, 共 120.7 次阅读, 收获喜欢 19 次。

关注

评论

发布
暂无评论
发现更多内容

第三周作业

孙强

架构训练营 0 期总结 -- 第三周

互金从业者X

新来的"大神"用策略模式把if else给"优化"了,技术总监说:能不能想好了再改?

Hollis

Java 设计模式

手握美团offer,结果背调红灯,哭了,网友:别小瞧背调公司

程序员生活志

面试 美团 offer 背调

学习总结 -- Week 3

吴炳华

极客大学架构师训练营

架构师训练营第三周命题作业

whiter

极客大学架构师训练营

架构师训练营 - 设计模式

Pontus

极客大学架构师训练营

第三周作业一

而立斋

单例模式 组合模式

作业03-代码重构

梦子说

极客大学架构师训练营 命题作业

极客时间架构师训练营 - week3 - 作业 1

jjn0703

极客时间 极客大学架构师训练营

架构师训练营 - 设计模式

Pontus

极客大学架构师训练营

第三周总结

孙强

只看到了别人28岁从字节跳动退休,背后的期权知识你知道吗?

四猿外

创业 程序员 字节跳动 个人成长 期权

架构师训练营第三周总结

王铭铭

作业-02

梦子说

极客大学架构师训练营 作业

MySQL-InnoDB 索引

Axe

架构师训练营第三周总结

allen

架构师训练营 - 学习总结 - 第三讲

吕浩

数字化转型必读书单

华章IT

数据中台 中台 数字化转型 行业资讯 银行数字化转型

summary of week3

东哥

单例模式的实现方式

互金从业者X

架构师训练营第三周作业

sunnywhy

架构师训练营第三周总结

sunnywhy

设计模式的应用

而立斋

总结

你不知道的 Web Workers (上)

阿宝哥

Java 大前端 Web Web Worker

总结-02-设计模式

梦子说

学习 极客大学架构师训练营

代码重构

dongge

架构师训练营 Week03 学习心得

架构师训练营第三周作业

时来运转

架构师训练营第 3 周作业

Season

单例模式 极客大学架构师训练营 组合模式

架构师训练营第三周作业

王铭铭

极客大学架构师训练营

序列化 .NET中的不可变集合_.NET_Jonathan Allen_InfoQ精选文章