HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

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

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

关注

评论

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

Vision pro、人形机器人、Hala Point

声网

搭建开发体育赛事直播平台:吸引用户并保持其粘性核心功能介绍

软件开发-梦幻运营部

Docker从入门到精通:Docker run 命令学习

霍格沃兹测试开发学社

鸿蒙HarmonyOS实战-ArkUI组件(Text/Span)

蜀道山

鸿蒙 程序员 架构 HarmonyOS 鸿蒙开发

碳课堂|什么是碳市场?如何进行碳交易?

AMT企源

碳交易 碳管理 碳市场

PHP调用API接口的方法及实现

百度搜索:蓝易云

php Linux 运维 API 云服务器

比特币之路:技术突破、创新思维与领军人物

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

第48期|GPTSecurity周报

云起无垠

Apache IoTDB v1.3.1 发布|增加多种脚本工具、内置函数等功能

Apache IoTDB

从 Apache Doris 到 SelectDB Cloud:云原生架构下的弹性能力揭秘

SelectDB

数据库 云计算 数据分析 云原生 弹性计算

基于RT-Thread的智能家居助手

梦笔生花

单片机 RT-Thread 语音控制

国内敏捷现状最新调研报告:2023中国企业敏捷实践白皮书

爱吃小舅的鱼

敏捷开发 中国企业敏捷实践白皮书

【Git-Exception】Git报错:fatal: unable to auto-detect email address

百度搜索:蓝易云

git 云计算 Linux 运维 云服务器

sonarqube的基本使用

百度搜索:蓝易云

云计算 Linux 运维 云服务器 SonarQube

利用观测云打造企业级的统一日志中心

观测云

日志分析

423世界读书日 和京东零售技术人一起读好书

京东零售技术

读书 企业号 4 月 PK 榜

Docker从入门到精通:Docker exec 命令学习

霍格沃兹测试开发学社

Docker从入门到精通:Docker log 命令学习

霍格沃兹测试开发学社

RAG 修炼手册|如何评估 RAG 应用?

Zilliz

Zilliz LLM rag

Linux查看属于某个组(例如docker组)的所有用户

百度搜索:蓝易云

Docker 云计算 Linux 运维 云服务器

C++ 访问说明符详解:封装数据,控制访问,提升安全性

小万哥

程序人生 编程语言 软件工程 C/C++ 后端开发

金字塔原理讲的什么?详细的麦肯锡金字塔读书笔记来了!

彭宏豪95

读书笔记 思维导图 在线白板 金字塔原理 效率软件

鸿蒙HarmonyOS实战-ArkUI组件(Progress)

蜀道山

鸿蒙 程序员 架构 HarmonyOS 鸿蒙开发

公链系统开发全指南: 从规划到实施

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

EPAI大模型开发平台,百模万企走出 “应用迷宫”

脑极体

AI

Docker从入门到精通:Docker pull命令学习

霍格沃兹测试开发学社

聚道云软件连接器助力医疗器械有限公司打通金蝶云星辰与飞书

聚道云软件连接器

案例分享

Docker从入门到精通:Docker容器相关命令学习

霍格沃兹测试开发学社

Linux设备驱动系列(三)——参数传递

Linux内核拾遗

linux开发 Linux内核 内核开发 设备驱动

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