热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

序列化.NET中的不可变集合

.NET不可变集合的序列化问题现在非常糟糕。如果你使用DataMember属性标记一个ImmutableList\u0026lt;T\u0026gt;类型的属性,那么

.NET不可变集合的序列化问题现在非常糟糕。如果你使用DataMember属性标记一个ImmutableList\u0026lt;T\u0026gt;类型的属性,那么标准的反序列化器好像会忽略它。没有运行时错误,但是数据就是不存在。

\u0026#xD;\n

你可以将属性改为IList类型从而防止数据丢失,但是这会导致一个语义问题。尽管你可以将一个不可变列表存储到一个IList中,但是这种做法令人难以接受,因为大多数人心里面都认为一个给定的IList不会是只读的。另外,类型检查器不能在编译时捕获这种错误。

\u0026#xD;\n

为了解决语义错误,用户认为可以提供一个IReadOnlyList类型的属性替代。不幸的是,这样做会在序列化期间抛出一个异常,除非添加了KnownType属性。但是一旦添加了该属性在对其序列化时就又会产生无声的错误。

\u0026#xD;\n

同样地,传统的序列化机制(使用Serializable属性)也不支持。Immo Landwerth写道:

\u0026#xD;\n
\u0026#xD;\n

是的。首先,我们使用的可移植子集(portable subset)不支持二进制序列化(visualstudio.uservoice.com/.../3701316-make-the-new-immutable-collection-types-serializab)。其次,我们喜欢一个能够在核心数据结构之外实现序列化的模型,因为这样在客户端/服务器场景下使用的时候就可以更加有弹性地实现变化、解决跨版本序列化问题。流行的序列化类库已经计划为不可变集合增加支持,例如JSON.NET、protobuf-net。

\u0026#xD;\n
\u0026#xD;\n

这样我们可以选择第三方类库,例如JSON.NET。截至版本5.0r7,JSON.NET已经支持.NET官方的不可变集合类库。该版本中的新内容还包括JsonExtensionData,它会将一个被反序列化类中的所有没有属性表示的附加数据存储起来。

\u0026#xD;\n

Marc Gravell还宣称protobuf-net将会支持不可变集合,

\u0026#xD;\n
\u0026#xD;\n

protobuf-net(r666)的主干现在已经支持不可变列表(List)、数组(Array)、字典(Dictionary)、哈希集合(Hash-Set)、排序集合(Sorted-Set)、排序字典(Sorted-Dictionary),同时它们的所有接口都有双份。但是所有内容都在一个单例模式识别块中。

\u0026#xD;\n
\u0026#xD;\n

查看英文原文:Serializing Immutable Collections in .NET


推荐阅读
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 基于halcon的特征匹配实例
    特征匹配原图模板识别图代码结果原图模板识别图代码*这个例子在图片数据库中查找文章的页面。*第一步是训练不同的页面并创建模型。*然后搜索未知图像并检测出正确的文章页面。*请注意& ... [详细]
  • 转载请注明原文地址:http:www.cnblogs.comygj0930p6409067.html1:HammingdistanceTheHammin ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • python3 nmap函数简介及使用方法
    本文介绍了python3 nmap函数的简介及使用方法,python-nmap是一个使用nmap进行端口扫描的python库,它可以生成nmap扫描报告,并帮助系统管理员进行自动化扫描任务和生成报告。同时,它也支持nmap脚本输出。文章详细介绍了python-nmap的几个py文件的功能和用途,包括__init__.py、nmap.py和test.py。__init__.py主要导入基本信息,nmap.py用于调用nmap的功能进行扫描,test.py用于测试是否可以利用nmap的扫描功能。 ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
  • Introduction(简介)Forbeingapowerfulobject-orientedprogramminglanguage,Cisuseda ... [详细]
  • 这篇文章主要讲解了“怎么用Python写一个电信客户流失预测模型”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入, ... [详细]
  • 第八章 元组与集合
    目录​一、元组二、集合三、集合的数学操作四、集合的相关操作五、集合间的关系六、列表、元组、集合、字典区别一、元组元组是python内置的数据结构之一, ... [详细]
  • 一.元祖类型 (tuple)1.什么是元祖?用途:用于存放多个值,当存放的多个值只有读的需求没有改变的需求时,用元祖最合适.定义方式:在()内用逗号分隔开的多个任意类型的值t(1, ... [详细]
author-avatar
Eliza
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有