BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

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

| 作者 Jonathan Allen 关注 594 他的粉丝 ,译者 孙镜涛 关注 2 他的粉丝 发布于 2013年11月13日. 估计阅读时间: 3 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

.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。

这样我们可以选择第三方类库,例如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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

微软为什么不把json.net 加到framework中? by Zhou Taurus

微软为什么不把json.net 加到framework中?

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

1 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT