常用数据格式:json、bson、msgpack

JSON(JavaScript Object Notation)

  • 常用文件格式,可读性高

  • 一般用于远端配置,客户端基础配置等。


BSON(Binary JSON)

  • 二进制的Json,一般用于服务器MongoDB存储。

  • 类型定义:https://bsonspec.org/spec.html

{"hello": "world"} →
\x16\x00\x00\x00           // total document size
\x02                       // 0x02 = type String
hello\x00                  // field name
\x06\x00\x00\x00world\x00  // field value
\x00                       // 0x00 = type EOO ('end of object')
  • 和json的差异: https://www.mongodb.com/json-and-bson

    • 更紧凑:二进制存储数据,json是字符类型,bson有时间类型,二进制对象等,更省空间。

    • 更快解析:json反序列化需要逐个字符解析,bson有记录类型和长度,可以更快解析。

    • 修改更快:json数据存储无类型,比如你要修改基本一个值,从9到10,由于从一个字符变成了两个,所以可能其后面的所有内容都需要往后移一位才可以。而使用BSON,你可以指定这个列为数字列,那么无论数字从9长到10还是100,我们都只是在存储数字的那一位上进行修改,不会导致数据总长变大。当然,在MongoDB中,如果数字从整形增大到长整型,还是会导致数据总长变大的。

    • 二进制可读性差。


msgpack(MessagePack)

  • 二进制的json,常用于通信数据包装。https://msgpack.org/

  • 类型定义:https://github.com/msgpack/msgpack/blob/master/spec.md

    常用数据格式:json、bson、msgpack_第1张图片

  • 比bson数据更紧凑,没有\x00结尾、类型和长度组成一个字节等。

  • 服务器gs和客户端lua都是一样名字的接口:msgpack.pack(table)


protobuf(Protocol Buffers)

  • https://github.com/protocolbuffers/protobuf

  • 常用协议格式,也是二进制,但我们游戏没用这个,主要是要预先定义数据格式(每次增删协议都要维护),有点像unity的Serializable。

  • 某些情况比MessagePack压缩解析更快。

  • 协议格式:标签号+类型号 | 数据大小 | 具体数据

enum Corpus {
  CORPUS_UNSPECIFIED = 0;
  CORPUS_UNIVERSAL = 1;
  CORPUS_WEB = 2;
  CORPUS_IMAGES = 3;
}

message SearchRequest {
  string query = 1;
  int32 page_number = 2;
  int32 results_per_page = 3;
  Corpus corpus = 4;
}

MemoryPack

  • https://github.com/Cysharp/MemoryPack

  • 相比其他数据封装读取更快,但压缩不一定更好。

你可能感兴趣的:(json)