写点什么

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

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

关注

评论

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

《分布式系统设计》(2) 关键概念和基本问题

陈皓07

Coinbase上市在即,这里有你想知道的一切

CECBC

比特币

Java流(Stream)操作实例-筛选、映射、查找匹配

Java小咖秀

Java stream java8 日常开发

Spark的动态资源分配

小舰

Spark调优 4月日更

神秘又强大的@SpringBootApplication注解

vivo互联网技术

Java 后端 springboot 注解分析

余额宝|三年开发|一二三四+HR面面经,已拿offer|

Java架构师迁哥

JVM-技术专题-MAT解析OOM问题

码界西柚

JVM

升级版数字人民币试点在深启动 这次有啥不一样?

CECBC

数字人民币

爽面数码打底浆说明书

C13713145387

爽面数码打底浆 哑面数码打底浆 数码打底浆

树莓派安装pytorch

IT蜗壳-Tango

4月日更

Spring 类型转换

邱学喆

Converter spring类型转换 GenericConversionService GenericConverter ResolvableType

Rust从0到1-枚举-定义

rust 枚举 Option

智慧公安情指勤系统搭建,指挥调度平台解决方

13828808769

智慧公安

计算机原理学习笔记 Day4

穿过生命散发芬芳

计算机原理 4月日更

读scss/sass实例项目带你入门

devpoint

SASS scss css预处理器

升级JDK到1.8笔记

风翱

jdk8 4月日更

什么是跨职能合作的关键?

王辉

团队管理 技术管理 沟通

完美的,从不空口说白话,140个案例带你深入理解微服务

Java架构师迁哥

「MySQL」深入理解事务的来龙去脉

学Java关注我

Java 编程 架构 程序人生 软件架构

微服务中台技术解析之项目环境隔离

小江

kafka 架构 DevOps 后端

无脑用 react 的 useCallback

sadhu

React Hooks 无脑 useCallback

InheritableThreadLocal源码解析,子线程如何获取父线程的本地变量?

徐同学呀

ThreadLocal Java源码

Python OpenCV 图像处理之图像直方图,取经之旅第 25 天

梦想橡皮擦

Python OpenCV 4月日更

Python模拟MOBA手游(三)

Bob

Python Python 游戏编程 4月日更

三分钟热度的你,不会得到你想要的结果

小天同学

坚持 日常感悟 4月日更 专心 个人思考

Linux 下的Zabbix Agent 安装

耳东@Erdong

Linux zabbix 4月日更

区块链商品防伪溯源平台搭建,实现数据信息安全共享

13828808769

区块链 商品溯源 #区块链#

用吃解决生活问题

石云升

读书笔记 好好吃饭 28天写作 4月日更

《分布式系统设计》(1) 从程序思维到系统思维

陈皓07

真假敏捷教练

escray

面试 面经 4月日更

区块链电子证照平台搭建,助推政务数字化发展

13828808769

电子存证 区块链+ #区块链#

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