一尘不染

比较JSON和BSON

json

我正在比较JSON和BSON用于序列化对象。这些对象包含多个大量整数的数组。在我的测试中,我要序列化的对象包含大约12,000个整数的总数。我只对序列化结果的大小比较感兴趣。我正在使用JSON.NET作为进行序列化的库。我使用JSON是因为我也希望能够在Javascript中使用它。

JSON字符串的大小约为43kb,BSON结果的大小为161kb。差异因子约为4。这不是我所期望的,因为我查看了BSON,因为我认为BSON在存储数据方面更有效。

所以我的问题是为什么BSON效率不高,可以提高效率吗?还是有另一种使用包含大量整数的数组来序列化数据的方法,可以在Javascript中轻松处理?

在下面,您可以找到测试JSON / BSON序列化的代码。

        // Read file which contain json string
        string _jsonString = ReadFile();
        object _object = Newtonsoft.Json.JsonConvert.DeserializeObject(_jsonString);
        FileStream _fs = File.OpenWrite("BsonFileName");
        using (Newtonsoft.Json.Bson.BsonWriter _bsonWriter = new BsonWriter(_fs) 
               { CloseOutput = false })
        {
            Newtonsoft.Json.JsonSerializer _jsonSerializer = new JsonSerializer();
            _jsonSerializer.Serialize(_bsonWriter, _object);
            _bsonWriter.Flush();
        }

编辑:

这是生成的文件
https://skydrive.live.com/redir?resid=9A6F31F60861DD2C!362&authkey=!AKU-
ZZp8C_0gcR0


阅读 808

收藏
2020-07-27

共1个答案

一尘不染

JSON和BSON的效率取决于您存储的整数的大小。有趣的一点是,ASCII占用的字节数少于实际存储整数类型的字节数。64位整数(即BSON文档的外观)占用8个字节。您的数字都少于10,000,这意味着您可以将每个ASCII存储在4个字节中(每个字符一个字节,直到9999)。实际上,您的大多数数据看起来都小于1000,这意味着可以将其存储为3个字节或更少的字节。当然,反序列化需要时间并且并不便宜,但可以节省空间。此外,Javascript使用64位值表示所有数字,因此,如果在将每个整数转换为更合适的数据格式后将其写入BSON,则BSON文件可能会更大。

根据规范,BSON包含许多JSON不包含的元数据。该元数据主要是长度前缀,因此您可以跳过不需要的数据。例如,获取以下数据:

["hello there, this is an necessarily long string.  It's especially long, but you don't care about it. You're just trying to get to the next element. But I keep going on and on.",
 "oh man. here's another string you still don't care about.  You really just want the third element in the array.  How long are the first two elements? JSON won't tell you",
 "data_you_care_about"]

现在,如果您使用的是JSON,则必须解析前两个字符串的全部内容以找出第三个字符串的位置。如果您使用BSON,您将获得更像的标记(但实际上并非如此,因为我出于示例的目的对此标记进行了标记):

[175 "hello there, this is an necessarily long string.  It's especially long, but you don't care about it. You're just trying to get to the next element. But I keep going on and on.",
 169 "oh man. here's another string you still don't care about.  You really just want the third element in the array.  How long are the first two elements? JSON won't tell you",
 19 "data_you_care_about"]

因此,现在,您可以读取“ 175”,知道向前跳过175个字节,然后读取“ 169”,向前跳过169个字节,然后读取“
19”并将接下来的19个字节复制到您的字符串中。这样,您甚至不必解析字符串以用作分隔符。

使用一个对另一个非常取决于您的需求。如果您要存储世界上所有时间都可以解析的大量文档,但是您的磁盘空间有限,请使用JSON,因为它更紧凑且空间效率更高。如果要存储文档,但是减少等待时间(也许在服务器环境中)对您而言比节省一些磁盘空间更为重要,请使用BSON。

选择时要考虑的另一件事是人类的可读性。如果您需要调试包含BSON的崩溃报告,则可能需要使用实用程序对其进行解密。您可能不仅知道BSON,还可以读取JSON。

常问问题

2020-07-27