AICon 上海站|日程100%上线,解锁Al未来! 了解详情
写点什么

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

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

关注

评论

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

架构实战营-毕业设计项目

阿体

Java进程cpu100%问题排查

陈皮的JavaLib

Java Linux 面试 8月日更

分享三个可改进的体验

石云升

用户体验 体验设计 8月日更

架构训练营毕业总结

冬天的树

云原生之可观测性【日志篇】 Logstash组件初探

路上的小崔哥

云原生 Logstash 日志 可观测性

单向数据流-从共享状态管理:flux/redux/vuex漫谈异步数据处理

zhoulujun

React Redux vuex vue2 状态机

PNG文件解读(2):PNG格式文件结构与数据结构解读—解码PNG数据

zhoulujun

png jpg

Kafka 和 Kinesis 之间的对比和选择

HoneyMoose

Tensorflow API(一)

毛显新

人工智能 深度学习 tensorflow keras

SLO(服务等级目标)与SLA(服务等级协议)

一个大红包

8月日更

白手起家之搜索利器Elastic search

卢卡多多

ES 8月日更

网络攻防学习笔记 Day98

穿过生命散发芬芳

态势感知 网络攻防 8月日更

数字新基建助推能源互联网“一体两翼”区块链中台应用建设思考

CECBC

Tensorflow随笔(一)

毛显新

人工智能 深度学习 tensorflow keras

【架构实战营】毕业总结

swordman

架构实战营

流处理基本概念(二)

Databri_AI

大数据 flink 窗口函数

三维旋转笔记:欧拉角/四元数/旋转矩阵/轴角-记忆点整理

zhoulujun

矩阵旋转 欧拉角 三维旋转 四元数

【前端 · 面试 】HTTP 总结(七)—— HTTP 缓存概述

编程三昧

面试 HTTP 8月日更 HTTP缓存

深度解析区块链数字票据及其优势

CECBC

微信朋友圈的高性能复杂度分析

Saber

架构实战营

当农产品拥有“身份证”区块链技术如何助力农产品溯源监管?

CECBC

ipfs挖矿怎么选择公司?ipfs挖矿收益怎么计算?

IPFS挖矿收益怎么计算 ipfs挖矿怎么选择公司

Docker可视化管理工具Portainer

xcbeyond

Docker Portainer 8月日更

模块10作业

wade

#架构实战营

安全世界观 | 常见WEB安全问题及防御策略汇总

架构精进之路

安全 8月日更

PNG文件解读(1):PNG/APNG格式的前世今生

zhoulujun

png

JavaScript 开发人员应该理解的 this

devpoint

JavaScript js变量声明 this 8月日更

JIT-动态编译与AOT-静态编译:java/ java/ JavaScript/Dart乱谈

zhoulujun

Java dart JIT

MongoDB 客户端怎么做负载均衡

海明菌

mongodb 负载均衡 客户端

模块四作业

秀聪

架构训练营

从java注解漫谈到typescript装饰器——注解与装饰器

zhoulujun

Java 注解 装饰器 ts 元数据

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