常用数据格式: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
-
比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
-
相比其他数据封装读取更快,但压缩不一定更好。