写点什么

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

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

关注

评论

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

Web和云开发,Rust会起飞?

高端章鱼哥

rust Web 云开发

来聊聊托管服务提供商(MSP)安全

树上有只程序猿

网络安全 msp

如何快速优化 CnosDB 数据库性能与延迟:使用 Jaeger 分布式追踪系统

CnosDB

时序数据库 开源社区 CnosDB 工程师有话说

注册与充值操作手册

zhizhi

AI azure openai AIGC zhizhi

IPQ5018|Unlocking Affordable WiFi 6: The Ultimate Solution

wallyslilly

ipq5018'

摆脱 OpenAI 依赖,8 分钟教你用开源生态构建全栈 AI 应用

Zilliz

Milvus AIGC LLM langchain cvpstack

leetcode22_Valid_Parentheses_有效的括号

okokabcd

LeetCode

Centos 7系统安装python 3.9.10详细教程。

百度搜索:蓝易云

Python 云计算 Linux centos 运维

软件测试/测试开发丨Python 常用第三方库 pymysql

测试人

Python MySQL 程序员 软件测试 测试开发

商密大会传捷报|海泰方圆喜获首届“熵密杯”密码应用安全竞赛优胜奖

电子信息发烧客

Programming abstractions in C阅读笔记: p114-p117

codists

活动预告|诚邀您参加HICOOL2023全球创业者峰会澜舟科技产品发布会

澜舟孟子开源社区

在 Dify 轻松调用顶尖开源与国产模型,解锁不同模型的潜力

Dify

ChatGPT 文心一言 ChatGLM 讯飞星火 llama2

智能化推送系统——APP出海营销的好帮手

MobTech袤博科技

前端开发 APP开发 前端开发工具 前端‘’

如何通过观测云的RUM找到前端加载的瓶颈--可观测性入门篇

Yestodorrow

可观测性

2023-08-16:用go语言如何解决进击的骑士算法问题呢?

福大大架构师每日一题

福大大架构师每日一题

LeetCode题解:2631. 分组

Lee Chen

JavaScript LeetCode

如何配置Apple推送证书 push证书

雪奈椰子

阿里云故障洞察提效 50%,全栈可观测建设有哪些技术要点?

阿里巴巴云原生

阿里云 云原生 可观测

Centos7系统一次性增加绑定多个IP教程。

百度搜索:蓝易云

云计算 Linux centos 运维 IP

Microsoft Office 2019 for Mac中文正式版下载v16.76

mac

office办公软件 Office 2019 苹果mac Windows软件下载

4 招搞定 Java List 排序

SoFlu-JavaAI开发助手

Java如何检查文件是目录还是文件?

SoFlu-JavaAI开发助手

SQLite数据库实现数据增删改查

芯动大师

推荐系统系列之推荐系统概览(上)

亚马逊云科技 (Amazon Web Services)

Amazon

CommunityOverCode Asia 议程上线|Apache Flink 项目实践

Apache Flink

大数据 flink 实时计算

使用 appuploader 工具流程(Windows 版本) 作者:雪奈椰子

ARTS 打卡第 7 天

自由

ARTS 打卡计划

ARTS 打卡第 1 周: Jackson如何自定义属性的序列化策略

前行

#Jackson #正则表达式 #IDEA高效使用技巧

Presto 设计与实现(二):一切从 0 开始?

冰心的小屋

数据湖 presto presto 设计与实现

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