比较JSON和BSON

时间:2012-09-26 12:37:23

标签: javascript .net json json.net bson

我正在比较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

1 个答案:

答案 0 :(得分:67)

JSON与BSON的效率取决于您存储的整数的大小。有一点很有意思,ASCII占用的字节数比实际存储整数类型少。 64位整数,它是你的BSON文件出现的方式,占用8个字节。您的数字都小于10,000,这意味着您可以将每个数据以4个字节存储在ASCII中(每个字符一个字节直到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。

FAQ