写点什么

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

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

关注

评论

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

使用Local Persistent Volume 部署有状态工作负载

华为云开发者联盟

Kubernetes 开发 华为云 华为云开发者联盟

AI遇上传统文化,文心一言上央视带来跨时空访古体验

飞桨PaddlePaddle

人工智能 深度学习

第三方 Cookie 被禁用?企业该如何实现用户精准运营和管理

Authing

Cookie Authing 用户运营

软件测试/测试开发/全日制/测试管理丨Appium Inspector

测试人

软件测试

苹果电脑应用程序无法打开提示不明开发者或文件损坏的处理方法

Rose

精彩推荐 |【Java技术专题】「重塑技术功底」攻破Java技术盲点之剖析动态代理的实现原理和开发指南(中)

码界西柚

Java 后端开发 JDK 动态代理 CGLIB 动态代理 2024年第十一篇文章

2024年的第一场 MatrixOne Meetup 来啦!

MatrixOrigin

数据库 分布式 云原生 MatrixOrigin MatrixOne

从前端角度浅谈性能 | 京东物流技术团队

京东科技开发者

Acrobat Pro DC 2023如何插入附件?Acrobat Pro DC添加附件方法

Rose

Parallels Desktop 17 安装Windows 11 教程 附激活工具

Rose

云厂商是什么意思?2024年知名云厂商有哪些?

行云管家

云计算 云服务 行云管家 云厂商

App加固:不同类型和费用对比

京东ES支持ZSTD压缩算法上线了:高性能,低成本 | 京东云技术团队

京东科技开发者

苹果电脑重装系统教程

Rose

数据采集在制造业中的应用场景

万界星空科技

数据采集 MES系统 设备管理 万界星空科技 生产管理

喜讯!矩阵起源子公司通过“国家高新技术企业”认定,引领数据库行业科技创新!

MatrixOrigin

数据库 分布式 云原生 MatrixOrigin MatrixOne

解决苹果无线鼠标、键盘或触控板无法被 Mac 识别的方法

Rose

替代关系型数据库 MAX 聚合函数的思路

alexgaoyh

MySQL 替代 聚合函数 最新数据 自关联

【年后跳槽必看篇-非广告】老生常态之Spring AOP/IOC 实现原理

派大星

Java 面试 跳槽

复杂经济时期下的企业财务规划战略

智达方通

全面预算 情景规划 企业财务规划 财务规划

QCN9024: The future of wireless communications, five major advantages over competitors

wallysSK

APP加固原理与作用

让 K8s 更简单!8款你不得不知的 AI 工具-Part 1

SEAL安全

开源 AI Kubernetes

FCPX 插件无法使用?|Final Cut Pro X 插件不能使用出现叹号的解决办法

Rose

面试官:如何保证本地缓存的一致性?

王磊

Java 面试

苹果电脑Mac教程:如何开启任何来源选项

Rose

KaiwuDB × 风电企业 | 高性能、低成本、释放数据价值

KaiwuDB

数据库 解决方案

“无法打开应用,因为Apple无法检查其是否包含恶意软件“解决方法

Rose

如何自定义Safari的起始页

Rose

运行Adobe应用提示非正版This non-genuine Adobe app has been disabled soon如何解决

Rose

adobe

​万界星空科技MES系统如何进行产品的质量管理

万界星空科技

质量管理 MES系统 制造业 mes 制造业生产管理系统

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