写点什么

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

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

关注

评论

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

后端缓存代码实践

Albert

缓存击穿 七日更

阿里高工手码”537页Spring源码速成手册“3天直接带你飙向实战

比伯

Java 编程 架构 面试 计算机

计算存储分离在消息队列上的应用

京东科技开发者

大数据 云原生 中间件 消息中间件

【数据结构与算法】分析时间复杂度与空间复杂度

三钻

数据结构与算法

甲方日常 73

句子

工作 随笔杂谈 日常

第六周技术选型作业-CAP原理概述

Geek_michael

极客大学架构师训练营

数字之暖:鹅厂云原生的“新路”与“历承”

脑极体

执子之手,与子长安:探秘华为运动健康实验室

脑极体

生产环境全链路压测建设历程 19:某快递 A 股上市公司的生产压测案例之下篇

数列科技杨德华

全链路压测 七日更

音乐后期处理:音乐失真效果制作

懒得勤快

音乐制作 编曲 编曲宿主 mid 音乐后期

第五课技术选型作业

Geek_michael

极客大学架构师训练营

盘点2020 | 所思、所遇、所学、所悟

三钻

程序员 大前端 盘点2020

永续合约交易系统开发模式定制

金瓯无缺江河一统|Win10系统基于Docker和Python3搭建并维护统一认证系统OpenLdap

刘悦的技术博客

Python TCP ldap openldap 统一管理

90%的程序员,都没用过多线程和锁,怎么成为架构师?

小傅哥

程序员 小傅哥 线程池 架构师 七日更

有效破解行业难点 专家称区块链+医疗发展还需找准应用场景

CECBC

区块链 大数据 医疗

世界之书:《一个人的朝圣》与重归信仰

lidaobing

一个人的朝圣 28天写作

分布式缓存架构

raox

极客大学架构师训练营

TypeScript | 第四章:命名空间和模块

梁龙先森

typescript 大前端 七日更

合约交易系统开发软件定制

简析5G时代的MART流处理

VoltDB

数据库 5G

Javascript | 模拟mvc实现点餐程序

LiOnTalKING

Java mvc 大前端 H5

全国首张数字人民币保单成功出单

CECBC

数字人民币保单

什么样的企业才需要用到云服务器?

德胜网络-阳

Docker终端无法输入中文问题解决

Simon

Docker 七日更

支持百万级TPS,Kafka是怎么做到的?

爱笑的架构师

kafka Kafka知识点 零拷贝 Mmap 七日更

函数进阶· 第3篇《常用内置函数filter()、map()、zip(),怎么用的呢?》

清菡软件测试

测试开发

甲方日常 74

句子

工作 随笔杂谈 日常

花火交易所系统开发|花火交易所软件APP开发

系统开发

MySQL用户与权限管理指南

Simon

MySQL 用户权限 七日更

新思科技:2021年软件安全行业六大趋势预测

InfoQ_434670063458

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