写点什么

序列化 .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:121437
用户头像

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

关注

评论

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

我在AIGC和数字中台方面的架构升级设计

大东(AIP智能体运营专员)

PoseiSwap 将向 Zepoch 节点持有者发放新一轮空投,生态启动在即

鳄鱼视界

趣解领域驱动设计-从地心说到日心说

凡语

领域驱动设计

代码随想录训练营Day04 - 链表(下)

jjn0703

Nautilus Chain 推出全新 Layer3 DID 公民身份,限量 10 万枚免费发放

鳄鱼视界

代码随想录训练营Day03- 链表(上)

jjn0703

AI、机器学习、大模型、生成式AI和安全

啸天

人工智能 机器学习 安全 大模型 ChatGPT

98位企业技术高管入学百度AICA 大模型带来AI人才三大能力要求

飞桨PaddlePaddle

人工智能 百度 paddle 百度飞桨

2023-07-02:给定一个1~N的排列,每次将相邻两数相加,可以得到新的序列,长度是N-1 再对新的序列,每次将相邻两数相加,可以得到新的序列,长度是N-2 这样下去可以最终只剩一个数字 比如 :

福大大架构师每日一题

Go 福大大架构师每日一题

“科创中国”大湾区青年百人会论坛成功举办

飞桨PaddlePaddle

人工智能 百度 paddle 百度飞桨

Nautilus Chain 推出全新 Layer3 DID 公民身份,限量 10 万枚免费发放

股市老人

PoseiSwap 将向 Zepoch 节点持有者发放新一轮空投,生态启动在即

BlockChain先知

PoseiSwap 将向 Zepoch 节点持有者发放新一轮空投,生态启动在即

西柚子

Java程序性能分析:开篇之jps

javalover123

Java 性能优化 性能 后端

专科学历,有机会转行程序员吗?

程序员晚枫

程序员 面试 转行 学习计划

py基础知识点归纳总结

全栈若城

Python 学习 基础

es笔记四之中文分词插件安装与使用

Hunter熊

中文分词 elasticsearch

C++实现对RGB图片进行编码

芯动大师

C++中fork函数的使用及原理

芯动大师

PoseiSwap 将向 Zepoch 节点持有者发放新一轮空投,生态启动在即

股市老人

Go 语言 context 都能做什么?

AlwaysBeta

Go Context go面试题

豫园股份基于低代码敏捷式开发的实践与落地

明道云

边阅读,边成长

少油少糖八分饱

阅读 每天读本书 书评

大厂月入3w+,失业焦虑折磨着我

程序员晚枫

程序员 大厂 焦虑

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