Flatbuffers 与 CBOR
Flatbuffers vs CBOR
请帮忙提出Flatbuffers and CBOR协议的优缺点。这两种二进制格式在他们的网站上都声称很好,但我无法在两者之间做出一些很好的区别。
平面缓冲区:
优势:
- FlatBuffer、Cap’n proto 和其他类似解决方案中的严格类型被视为性能的主要关键点,因为不需要额外的 encoding/decoding。
- 数据模型允许简单偏移具有紧凑数据结构和快速访问的类型化对象
- FlatBuffers 不需要解析/解包步骤到二级表示,然后您就可以访问通常与每个对象内存分配相结合的数据。
缺点:
- 新的而不像 CBOR 那样标准化。
CBOR
优势:
- 可以在没有额外内存的情况下完全在流中创建和处理
- 不必预先定义任何模式,因为我们的数据是动态的和可变的
- 它是 IETF 的一项开放国际标准,这使其成为比专有标准更好的选择。
- 它专为低内存、非转换、基于流的处理而设计,同时还为其他数据类型提供扩展
缺点:
- CBOR 表示它遵循 JSON 模型(因此不是严格类型的对象)
- 它以相同类型的对象(字符串、整数、映射等)开头。
PS:
与平面缓冲区相比,感觉在 CBOR 中管理类型的性能成本更高,但由于 CBOR 是标准化协议,如果这种差异不是很大,我倾向于更喜欢它。请让我知道你们会推荐哪两个以及为什么。
我想你自己已经说得很清楚了。 FlatBuffer 的优势在于无需 parsing/unpacking/allocation 即可访问数据,这在某些情况下可以带来显着的性能优势。但是,如果这对您来说无关紧要,例如Protocol Buffers 可能同样有效。
数据中的强类型与动态类型也很重要。如果我想要提前没有限制的通用数据存储,我只会使用后者。
顺便说一句,如果出于某种原因您更喜欢动态类型,但也希望获得就地访问的性能优势,实际上有一种格式将两者结合在一起:https://google.github.io/flatbuffers/flexbuffers.html
FlatBuffers 不是 "proprietary"。它可能是在 Google 设计的,但它是开源的并且被许多其他公司所依赖。
我为我的网站选择了 CBOR https://kwippe.com - 我们用它来将所有艺术品和关键字数据存储为非常小的 JSON 结构中的压缩字符串,只有少数属性是分类所必需的文件。所以文件非常小,加载速度非常快。我将其用于超过 30,000 个 SVG 文件,我事先将其转换为 JSON。所有 JSON 都转换为字符串并通过字符串压缩库进行压缩,然后保存为我编码为 CBOR 的较小 JSON 对象的一部分。
我在使用这个 CBOR 系统时遇到的问题很少,而且它比 FlatBuffers 和我看过的其他一些二进制解决方案更容易设置。
我有同样的问题,出于几个原因选择了 CBOR。
你有一个 CON,像 JSON 这样的 CBOR 没有严格的类型,是的,你需要做一些验证以确保你得到的类型是你期望的类型。没错,这就是 Schema 序列化程序为您提供的。你失去了改变类型的灵活性,但你知道你会得到什么。我从事 C 语言的嵌入式工作,静态类型很重要。
您没有列为 PRO 的是 CBOR 'can' 保留 JSON 兼容性。任何有效的 JSON 都是有效的 CBOR,但反之则不然。 cbor 可以有一个 1 : 2 的映射项(对象,key/value 对),即整数 1 名称的值为整数 2。这不是很好的做法,但它可能有一些用途。如果你避免故意不兼容的东西,CBOR >> JSON 转换会非常方便。你什么时候用那个?好吧,我用它来做日志。当我的 CBOR 数据包到达我们的服务器时,它们被转换为 JSON 并存储在人类可读的地方以供分析。您可以使用任何序列化程序执行此操作,但我们认为在关闭转换中出现“解释”差异的可能性要小得多。
我们的主要因素是架构太难共享和同步。如果您拥有 A 到 B 系统的两边,那么架构就很棒!您可以获得大小效率,因为地图 "Apples" : 100 仅存储为 [1,100] 但您必须在两侧获取架构文件并编译(如果使用代码生成)才能完成任何工作。好吧,但是如果你有 10 个星形模式 A B C D E F G H I J,A 和 J 可以互相接收消息,B 和 H 几乎完全聊天,除了发送给 E 并且永远不会返回的消息,等等......在这种情况下,架构可能非常困难!也许它正在工作并且您添加了一大堆消息选项是使用旧模式,可选或缺少定义,或者您同步每个人。对我们来说就是这种情况,它会在 4 种语言和我们不拥有的系统中发生。
相反,我们选择了无模式 CBOR 并适当地命名每个映射项。 “apples”代表 A、B、C 和 J。“bananas”代表 C、H 和 E,但永远不会代表 F,等等。每一方都需要知道它应该期待什么,仅此而已。
据我了解,FlatBuffers确实有schema-less模式,但我对此知之甚少。我认为没有正确的答案,但就其价值而言,我们的 Web 开发人员立即接受并理解了 CBOR,因为它在外观和感觉上与 JSON.
非常相似
请帮忙提出Flatbuffers and CBOR协议的优缺点。这两种二进制格式在他们的网站上都声称很好,但我无法在两者之间做出一些很好的区别。
平面缓冲区:
优势:
- FlatBuffer、Cap’n proto 和其他类似解决方案中的严格类型被视为性能的主要关键点,因为不需要额外的 encoding/decoding。
- 数据模型允许简单偏移具有紧凑数据结构和快速访问的类型化对象
- FlatBuffers 不需要解析/解包步骤到二级表示,然后您就可以访问通常与每个对象内存分配相结合的数据。
缺点:
- 新的而不像 CBOR 那样标准化。
CBOR
优势:
- 可以在没有额外内存的情况下完全在流中创建和处理
- 不必预先定义任何模式,因为我们的数据是动态的和可变的
- 它是 IETF 的一项开放国际标准,这使其成为比专有标准更好的选择。
- 它专为低内存、非转换、基于流的处理而设计,同时还为其他数据类型提供扩展
缺点:
- CBOR 表示它遵循 JSON 模型(因此不是严格类型的对象)
- 它以相同类型的对象(字符串、整数、映射等)开头。
PS:
与平面缓冲区相比,感觉在 CBOR 中管理类型的性能成本更高,但由于 CBOR 是标准化协议,如果这种差异不是很大,我倾向于更喜欢它。请让我知道你们会推荐哪两个以及为什么。
我想你自己已经说得很清楚了。 FlatBuffer 的优势在于无需 parsing/unpacking/allocation 即可访问数据,这在某些情况下可以带来显着的性能优势。但是,如果这对您来说无关紧要,例如Protocol Buffers 可能同样有效。
数据中的强类型与动态类型也很重要。如果我想要提前没有限制的通用数据存储,我只会使用后者。
顺便说一句,如果出于某种原因您更喜欢动态类型,但也希望获得就地访问的性能优势,实际上有一种格式将两者结合在一起:https://google.github.io/flatbuffers/flexbuffers.html
FlatBuffers 不是 "proprietary"。它可能是在 Google 设计的,但它是开源的并且被许多其他公司所依赖。
我为我的网站选择了 CBOR https://kwippe.com - 我们用它来将所有艺术品和关键字数据存储为非常小的 JSON 结构中的压缩字符串,只有少数属性是分类所必需的文件。所以文件非常小,加载速度非常快。我将其用于超过 30,000 个 SVG 文件,我事先将其转换为 JSON。所有 JSON 都转换为字符串并通过字符串压缩库进行压缩,然后保存为我编码为 CBOR 的较小 JSON 对象的一部分。
我在使用这个 CBOR 系统时遇到的问题很少,而且它比 FlatBuffers 和我看过的其他一些二进制解决方案更容易设置。
我有同样的问题,出于几个原因选择了 CBOR。
你有一个 CON,像 JSON 这样的 CBOR 没有严格的类型,是的,你需要做一些验证以确保你得到的类型是你期望的类型。没错,这就是 Schema 序列化程序为您提供的。你失去了改变类型的灵活性,但你知道你会得到什么。我从事 C 语言的嵌入式工作,静态类型很重要。
您没有列为 PRO 的是 CBOR 'can' 保留 JSON 兼容性。任何有效的 JSON 都是有效的 CBOR,但反之则不然。 cbor 可以有一个 1 : 2 的映射项(对象,key/value 对),即整数 1 名称的值为整数 2。这不是很好的做法,但它可能有一些用途。如果你避免故意不兼容的东西,CBOR >> JSON 转换会非常方便。你什么时候用那个?好吧,我用它来做日志。当我的 CBOR 数据包到达我们的服务器时,它们被转换为 JSON 并存储在人类可读的地方以供分析。您可以使用任何序列化程序执行此操作,但我们认为在关闭转换中出现“解释”差异的可能性要小得多。
我们的主要因素是架构太难共享和同步。如果您拥有 A 到 B 系统的两边,那么架构就很棒!您可以获得大小效率,因为地图 "Apples" : 100 仅存储为 [1,100] 但您必须在两侧获取架构文件并编译(如果使用代码生成)才能完成任何工作。好吧,但是如果你有 10 个星形模式 A B C D E F G H I J,A 和 J 可以互相接收消息,B 和 H 几乎完全聊天,除了发送给 E 并且永远不会返回的消息,等等......在这种情况下,架构可能非常困难!也许它正在工作并且您添加了一大堆消息选项是使用旧模式,可选或缺少定义,或者您同步每个人。对我们来说就是这种情况,它会在 4 种语言和我们不拥有的系统中发生。
相反,我们选择了无模式 CBOR 并适当地命名每个映射项。 “apples”代表 A、B、C 和 J。“bananas”代表 C、H 和 E,但永远不会代表 F,等等。每一方都需要知道它应该期待什么,仅此而已。
据我了解,FlatBuffers确实有schema-less模式,但我对此知之甚少。我认为没有正确的答案,但就其价值而言,我们的 Web 开发人员立即接受并理解了 CBOR,因为它在外观和感觉上与 JSON.
非常相似