比较JSON和BSON

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

JSONstring的大小约为43kb,BSON结果的大小为161kb。 所以差异因子约为4.这不是我所期望的,因为我看了BSON,因为我认为BSON在存储数据方面更加高效。

所以我的问题是为什么BSON效率不高,能否提高效率呢? 还是有另一种方式序列化数组包含大量的整数,这可以很容易地在Javascript中处理?

下面你可以findtestingJSON / 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

JSON vs BSON的效率取决于你存储的整数的大小。 有一个很有意思的地方,ASCII占用的字节数比实际存储的整数typesless。 64位整数,就是它出现在你的BSON文档中,占用8个字节。 你的数字都小于10,000,这意味着你可以用ASCII码以4字节存储每个字符(每个字符一个字节到9999)。 实际上,大部分数据看起来都小于1000,这意味着它可以存储在3个或更less的字节中。 当然,反序列化需要时间,并不便宜,但是可以节省空间。 此外,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,则必须parsing前两个string的全部内容以找出第三个string的位置。 如果你使用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个字节复制到你的string。 这样你甚至不必为分隔符parsingstring。

使用一个对另一个是非常依赖于你的需求。 如果您要存储世界上所有时间parsing的大量文档,但是您的磁盘空间有限,请使用JSON,因为它更紧凑,更节省空间。 如果打算存储文档,但减less等待时间(可能在服务器上下文中)对于您来说比保存一些磁盘空间更重要,请使用BSON。

在您select的另一个要考虑的是人的可读性。 如果您需要debugging包含BSON的崩溃报告,则可能需要一个实用程序来解密它。 你可能不会只知道BSON,但你可以阅读JSON。

常问问题