2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

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

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

关注

评论

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

Linux之locate命令

入门小站

Linux

架构实战营 模块七作业

Dylan

架构实战营

Redisson 分布式锁源码 03:可重入锁互斥

程序员小航

redis 源码 分布式锁 redisson

架構實戰營 - 模塊 7 作業

Frank Yang

架构实战营

架构训练营模块七作业

Neil43

架构训练营

架构实战营模块 7

阿体

Vue.js+ElementUI+vant生成动态表单配置

二郎神杨戬

7月日更

UD众筹链/UD生态系统APP开发详情

架构实战营-模块一作业

思梦乐

架构实战营

架构之:微服务和单体服务之争

程序那些事

微服务 系统架构 软件架构 程序那些事

海洋之星系统开发|海洋之星软件APP开发

反恶意收购的几种方式

石云升

职场经验 7月日更

【Flutter 专题】96 图解 Draggable + DragTarget 基本拖拽效果

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 7月日更

Rust从0到1-Cargo-发布到Crates.io

rust 发布 cargo crates.io publish

JavaScript数组详解-全网最全

二郎神杨戬

7月日更

6 月日更总结 | 总是断更的失败经验分享

耳东@Erdong

7月日更 日更

多标签分类中的损失函数与评价指标

月来客栈

PyTorch 多标签 多标签分类 文本分类

富文本编辑器之游戏角色升级ing

vivo互联网技术

Java 大前端 富文本 富文本编辑器

一条SQL语句执行的背后

卢卡多多

log sql 更新 执行顺序 7月日更

社交软件上“你可能认识的人”到底是怎么找到你的?

华为云开发者联盟

知识图谱 社交软件 TransE模型 用户画像 知识图谱补全

模块七:课后作业

Geek_9cf7b5

在线HTTP请求/响应头转JSON工具

入门小站

工具

架构实战营 - 模块一作业

Julian Chu

#架构实战营

2022vue面试题+答案

buchila11

Vue Vue 3

联想科技产业行——大众集团走进联想:智慧科技赋能汽车行业智能化变革

科技大数据

科技互联网 新未来 联想

IPC阿波罗公链软件系统开发搭建

根据舌苔判断身体状况

kof11321

王者荣耀商城异地多活架构

白发青年

架构实战营

图分析入门

6979阿强

模块七 作业

CR

@Autowired报错原因分析和4种解决方案!

王磊

Java spring springboot @Autowired注入原理 Autowired

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