当前位置: 首页 > 面试题库 >

比较JSON和BSON

步炯
2023-03-14
问题内容

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


问题答案:

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。

常问问题



 类似资料:
  • 问题内容: 我想知道哪个更快:XML和JSON?什么时候使用哪一个? 问题答案: 在回答何时使用哪一个之前,有一点背景知识: 编辑:我应该提到,这种比较实际上是从在具有JavaScript的浏览器中使用它们的角度来看的。这也不数据格式的方法 有 被使用,并且有很多很好的解析器,这将改变细节,使我在说什么不是很有效的。 JSON既更紧凑,又(在我看来)更具可读性-在传输中,仅因为传输的数据较少,它就

  • He called the crowd with his disciples, and said to them,"If any want to become my followers, let them deny themseleves and take up their cross and follow me. For those who want to save their life wil

  • 问题内容: 我有这个间隔,当前每5秒执行一次ajax请求。我对声明有疑问。我的代码总是输入它,并且两个json值完全相同,为什么它认为它们不同? 编辑 这是控制台输出(虚线是分隔请求,它不在实际输出中) 问题答案: 不能保证以相同的方式序列化JSON对象,也不能保证属性以相同的顺序进行序列化,使用并不是测试对象相等性的好方法。 一个更好的例子是这样的函数(前一段时间在互联网上找到,希望我能感谢原始

  • 问题内容: 是否可以比较2组json对象的差异?我所拥有的是一个通过jquery $ post()轮询JSON对象的脚本。我想要做的是拿走刚刚被轮询的对象,并将其与存储的对象进行比较。如果一个与另一个之间有任何更改,请将其应用于存储对象或替换(以任何一种方式替换),但是从UI角度来看,我正在通过查找两者之间的差异,将更改无缝地应用于JSON对象。 2.之所以要这样做,是因为现在我已经拥有了UI,因

  • 问题内容: 是否有任何方法可以接收2个JSON对象并将其进行比较以查看是否有任何数据已更改? 编辑 在审查评论之后,需要进行一些澄清。 JSON对象定义为 “一组无序的名称/值对。一个对象以{(左括号)开始,以}(右括号)结束。每个名称后面都带有:(冒号),名称/值对之间以,(逗号)分隔。 ”。- json.org 我的目标是能够简单地比较2个JSON对象文字。 我不是javascript专家,所

  • 我读到这些方法返回值的规则是,对于obj1.compareTo(ob2),例如,如果ob2在层次结构中位于ob1之下,则返回值为负值,如果它位于ob1之上,则返回值为正(如果它等于,则返回值为0)。然而,在我的类中,我看到了使用Math.signum在compareTo方法中获得-1(表示负值)和1(表示正值)的示例。 有什么原因吗? 编辑: 以下是我的意思: