Qwen3 惊喜上线阿里云百炼,8款模型全开源!点击免费领取 800万 tokens! 了解详情
写点什么

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

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

关注

评论

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

建木v2.5.7发布

Jianmu

DevOps 持续集成 CI/CD 自动化运维

为了讲明白继承和super、this关键字,群主发了20块钱群红包

华为云开发者联盟

开发 华为云 企业号十月 PK 榜 发红包

新来个技术总监,仅花2小时,撸出一个多线程永动任务,看完直接跪了,真牛逼!

小小怪下士

Java 程序员 多线程

华为云,高品质保障企业的等保安全

科技之光

从P5~P8!最适合在职Java程序员学习提升路线大公开!

Java永远的神

程序人生 后端 架构师 java程序员 Java学习路线

Nodejs:ESModule和commonjs,傻傻分不清

coder2028

node.js

Kyligence 当选 Gartner 2022 中国数据管理 Cool Vendor

Kyligence

Gartner 数据管理

企业架构-了解分布式

马说IT

企业架构 分布式系统 凤凰架构 书籍拆解

git-secret:在 Git 存储库中加密和存储密钥(下)

SEAL安全

git 加密 makefile 密钥管理 10月月更

koa实战

coder2028

node.js

千万级高并发秒杀系统设计套路!超详细解读~~

博文视点Broadview

Docker | 部署nginx服务

甜点cc

nginx Docker 10月月更

钛媒体 | 发布PaaS平台2.0,元年科技通过自主技术撬起更大市场

元年技术洞察

媒体 PaaS

深入nodejs的event-loop

coder2028

node.js

“程”风破浪的开发者|什么是web3.0,一文带你搞懂它

共饮一杯无

前沿技术 Web3.0 10月月更 “程”风破浪的开发者

多版本并行,测试如何做好质量保障?

老张

质量保障 版本迭代

面试官:你说说JavaScript中类型的转换机制

CoderBin

JavaScript 面试 前端 类型转换 10月月更

Java中的抽象类详解

共饮一杯无

Java 抽象类 10月月更

Docker | 镜像浅析,以及制作自己的镜像

甜点cc

Docker tomcat 10月月更

OpenHarmony轻量系统中内核资源主要管理方式

OpenHarmony开发者

OpenHarmony

“程”风破浪的开发者|THREE.JS实现看房自由(VR看房)

知心宝贝

前端 three.js 元宇宙 VR看房 “程”风破浪的开发者

一文梳理2048小游戏从开发到上云全流程

华为云开发者联盟

云计算 游戏开发 华为云 企业号十月 PK 榜 2048小游戏

Rocksdb dynamic-level-bytes测试简单记录

TiDB 社区干货传送门

实践案例 管理与运维

【文本检测与识别白皮书】第三章-第三节:算法模型

合合技术团队

人工智能 深度学习 文字识别 文本

零信任时代安全沙箱成为企业应用必需品

FinClip

数据中台的前世今生(一):数据仓库——数据应用需求的涌现

雨果

数据中台 数据仓库

TiCDC 实践:TiDB 到 TiDB 增量数据迁移

TiDB 社区干货传送门

迁移

TiDB v6.1.0 及 TiUniManager 在 openEuler 22.03 中的部署踩坑实践

TiDB 社区干货传送门

实践案例 管理与运维 安装 & 部署 应用适配 6.x 实践

华为云,中小型企业的等保安全专家

科技之光

华为云,助力企业快速省心过等保

科技之光

如何定义LED显示屏与OLED显示屏

Dylan

LED LED显示屏 OLED

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