JSON,仅支持极少的数据类型,或者是为了跨平台和语言的兼容性,又或者是因为其他什么原因。总之,它虽然成为现在网络传输接口中最普遍的数据结构,但由于自身限制,在使用过程中它也给开发者带来了一些负担。诸如类型丢失,某些数据无法被序列化而丢失等等。开发者需要非常小心才能理解到自己需要在将对象序列化成 JSON 之前,下一些功夫,才能保证自己的数据被正确传输了。

例如,ES2015 之后引入的 Map 和 Set 类型,使用已经相当普遍,但虽如此,它们依旧没有实现序列化 JSON 的接口,如果尝试使用 JSON.stringify() 来序列化它们,则只会得到一个空对像。即使开发者有意将其在转换之前自己先把元素拷贝到一个标准对象上以便传输,在数据的接收端,依旧不会自动还原为原来的模样。在这个过程中,开发者面临着数据和类型丢失的双重问题。

BSON,一种继承了 JSON 的数据结构,被运用于 MongoDB 上,它革命性的引入了少量的“复合类型”来弥补 JSON 的不足,如 ObjectId, ISODate 等,但也仅仅是为了数据存储和比较的方便,因此并没有大胆地继续开拓其它类型。

我最近在一些个人的“小项目”中,主要是 IPC/TCP 通信上,大概是利用 NodeJS 的集群(cluster)来广播事件和传递数据,其中有一个是要实现一个基于“内存-文件”的集群存储器,用以在集群进程中同步和共享缓存数据。也就是在这个过程中想到了要开发一个新的数据结构来解决 JSON 玄而未决的问题。

当然这个新的数据结构并不只用来做数据保存,最重要的是它能够最大程度解决数据传输过程中丢失类型和状态的问题,并更多地应用在 IPC/RPC 传输上,来保证数据传输端和接收端的数据一致性。

我曾经做过两年的 PHP 开发,在 PHP 中有一对 serialize/unserialize 函数用来序列化和反序列化数据,并且它们支持自定义的数据类型,即开发者自己定义的实现序列化接口(__sleep__wakeup)的类。这个给我很大灵感,几乎一开始我差点就设计成了类似它的数据结构。

但经过了慎重考量之后,我决定使用和 BSON 类似的方案,原因有二:

1. 格式最接近 JSON,且解析器将兼容 JSON/BSON 数据;

2. 支持数据文本格式化,从而支持更丰富的特性,如注释,因此解析器也将兼容 JSONC(JSON with comments)。

这样,数据不但简洁,而且易于阅读。

由于这个数据结构主要用于 IPC/TCP 通讯和数据存储上,为了尽量压缩其长度以减小带宽和磁盘容量,我决定将其设计为双引号可选,即对于支持可以直接作为 JS 对象属性的拉丁字符,不使用双引号。因此这个新的数据结构的模样将会和一个普通和 JS 对象字面量“一模一样”。并且为了使相似度高度还原,它还支持包括所有进制的数字字面量、支持所有 JS 引号的字符串,正则表达式字面量等。

这个新的数据结构,我将其取名为 FRON/frʌn/,Feature-Rich Object Notation)。

hyurl/fron​github.com

下面是一些 FRON 基本数据类型表示法的示例:

/************************ Literal Types *************************/// String
'single-quoted string'
"double-quoted string"
`string
in
multiple
lines`// number
12345
1e+32
NaN
Infinity// boolean
true
false// RegExp
/[a-zA-Z0-9]/i// null
null// Comment
// single-line comment
/* inline comment */
/*
comment
in
multiple
lines
*//************************ Compound Types *************************/// Technically, Object and Array are compound types.
// Object
{ hello: "world", "key with quotes": 12345 }// Array
["Hello", "World!"]// Date
Date("2018-12-10T03:21:29.015Z")// Error
Error({ name: "Error", message: "something went wrong", stack: ... })// Map
Map([["key1", "value1"], ["key2", "value2"]])// Set
Set([1, 2, 3, 4])// Symbol
Symbol("description")// RegExp
RegExp({ source: "[a-zA-Z0-9]", flags: "i" })// Reference
Reference("") // circular reference to the root object.
Reference("abc")
Reference("abc.def")
Reference("abc['d e f']")// TypedArray
Int8Array([1, 2, 3, 4])
Int16Array([1, 2, 3, 4])
Int32Array([1, 2, 3, 4])
Uint8Array([1, 2, 3, 4])
Uint16Array([1, 2, 3, 4])
Uint32Array([1, 2, 3, 4])

除了内置支持的类型之外,FRON 允许使用者注册自定义的类型,从而支持更多类型;并且允许使用别名类型,来把一个新类型注解应用到一个现成的处理方案上,从而实现不同语言偏好上的兼容。另外,FRON 使用了一个内置的复合类型 Reference 来处理数据引用,同时解决了 JSON 引用的重复拷贝和不支持递归引用的问题。

目前 FRON 仅实现了 TypeScript/JavaScript 的 beta 版本,差强人意的是,JS 的运算效率还是跟不上,测试结果表明其序列化和反序列化速度距离 JSON 还有很大距离。为了防止阻塞线程,目前的方案是同时提供了异步版本的函数。虽然如此,在解析过程中依旧需要等待比较长的时间(相对于 JSON)才能够获得最后的结果。

因此,计划是未来使用 rust 这类高性能语言来编写另一个版本,并作为 NodeJS 插件引入,毕竟 IPC/RPC 通信还是要求高响应速度的,光异步处理还远远不够。So, let's keep on.

心电图数据结构化标准_自己实现一个类 JSON 数据结构相关推荐

  1. java在类中创建一个对象_在另一个类中创建类对象

    我创建了两个类对象,每个对象都有一个构造函数,我试图让一个类对象成为另一个对象中的私有变量 . 这是我想要做的一个简单的例子,而不是实际的类名,而是一个例子 . 有更多的公共和私人变量,但为了简单起见 ...

  2. java数据结构与算法_清华大学出版社-图书详情-《数据结构与算法分析(Java版)》...

    前 言 数据结构是计算机程序设计重要的理论技术基础,它不仅是计算机学科的核心课程,而且已经成为计算机相关专业必要的选修课.其要求是学会分析.研究计算机加工的数据结构的特性,初步掌握算法的时间和空间分析 ...

  3. java数据结构创建树_在java中创建树数据结构?

    我试图在 java中创建一个树数据结构,其中每个父节点只能有三个子节点,但在节点至少有一个子节点但少于3个子节点的情况下,我一直坚持在树上添加一个节点.我不确定是否应该使用迭代器来迭代我当前节点的节点 ...

  4. python数据结构实验目的_图的基本操作实现(数据结构实验)

    课程名称:数据结构 实验项目名称:图结构基本操作的实现 实验目的: 1.掌握图的基本操作-遍历. 实验要求: 1. 分别用DFS和BFS的方法实现一个无向图的遍历. 实验过程: 1. 创建一个图(可用 ...

  5. 数据结构知识点总结_大牛带你学 | 考研数据结构中线性表中顺序结构的知识点总结...

    前言 我们都知道,数据结构中逻辑结构可以划分为线性结构(线性表)与非线性结构两大类. 而存储结构指的是数据元素在计算机中的存储及其逻辑关系的表现,也就是在计算机当中对逻辑结构的表示. 线性表的存储结构 ...

  6. python多个函数_请教:一个类中可以定义多个同名函数?

    python认为每个文件是一个module 每个函数的的作用域就是本module 但是module可以被import import进来的module相当于在本module内 谢谢,你说得对,昨晚太晚了 ...

  7. pta数据结构实验在数组中查找指定元素_如何从一个数组中查找指定的元素,并返回这个元素在数组中的位置...

    展开全部 和Vector都是使用Objec的数组形式来存储的.当你向这两种类型中增加元素的时候,如果元素的数目超出e68a84e8a2ad62616964757a686964616f313332646 ...

  8. golang 热插拨 插件_从零开始实现一个插件化框架(一)

    欢迎关注专栏:里面定期分享Android和Flutter架构技术知识点及解析,还会不断更新的BATJ面试专题,欢迎大家前来探讨交流,如有好的文章也欢迎投稿. Flutter跨平台开发终极之选​zhua ...

  9. java插件化_从零开始实现一个插件化框架(一)

    欢迎关注专栏:里面定期分享Android和Flutter架构技术知识点及解析,还会不断更新的BATJ面试专题,欢迎大家前来探讨交流,如有好的文章也欢迎投稿.Flutter跨平台开发终极之选​zhuan ...

最新文章

  1. Python基础学习!容器:列表,元组,字典与集合!(1)
  2. iOS程序健壮性笔记
  3. 碉堡!Mysql8.0竟然可以直接操作json文档了。。。
  4. 种树(信息学奥赛一本通-T1423)
  5. 全局变量、局部变量、静态全局变量、静态局部变量的区别
  6. #华为云·寻找黑马程序员#【代码重构之路】如何“消除”if/else
  7. python scrapy框架 简书_python scrapy 实战简书网站
  8. 基础集合论笔记 目录
  9. Dev C++下载地址和安装教程(图解)
  10. 如何查询OS、CPU、内存、硬盘信息
  11. PDF用什么软件编辑,怎么添加PDF水印
  12. OSPF域外(外部)路由(四、五类LSA)
  13. Java开发自学教程!java应届生面试自我介绍
  14. elasticsearch 深入 —— 地理位置
  15. 揭秘 Win8 电脑 OEM 分区创建
  16. 兴业消费金融股份公司市场总监杜一谦:合规化进程中的消费金融探索
  17. frl啥意思_轻钢笔记《FRL60/60/60是什么意思?》
  18. 计算机对逻辑算符的运算次序,逻辑运算符的优先顺序
  19. 看这里!你的手机号关联了多少互联网账号?一证通查→
  20. 2021全球与中国锂一次电池市场现状及未来发展趋势

热门文章

  1. 华为nova7se乐活版支持鸿蒙,华为nova7se乐活版和畅享20se哪个好 参数区别对比评测...
  2. python 生成器_python 生成器 - 刘江的python教程
  3. python能自学成功吗-为什么那么多自学Python的后来都放弃了,总结起来就这些原因...
  4. python软件下载安装-【Python下载】Python安装 v3.8.1 官方版-七喜软件园
  5. python3下载-python下载 v3.7.0 官方正式版
  6. python入门代码大全-python入门代码指南教程书籍推荐2020总结全集汇总
  7. python编程入门第3版pdf-Python程序设计 第3版pdf
  8. 编程语言python怎么读-Python之编程基础(编程语言分类)
  9. 语音识别技术的原理及研究难点
  10. vue中:class实现样式的绑定