BSON解码器异常

时间:2012-08-11 11:17:08

标签: mongodb bson

由于Mongo使用BSON,我使用Java API的BSONDecoder从Mongo查询中获取BSON文档并打印字符串输出。在下面,byte []数组存储MongoDB文档的字节(当我打印十六进制值时,它们与Wireshark中的相同)

  byte[] array = byteBuffer.array();
  BasicBSONDecoder decoder = new BasicBSONDecoder();
  BSONObject bsonObject = decoder.readObject(array);
  System.out.println(bsonObject.toString());

我收到以下错误:

  org.bson.BSONException: should be impossible

引起:java.io.IOException:意外的EOF     at org.bson.BasicBSONDecoder $ BSONInput._need(BasicBSONDecoder.java:327)     at org.bson.BasicBSONDecoder $ BSONInput.read(BasicBSONDecoder.java:364)     在org.bson.BasicBSONDecoder.decodeElement(BasicBSONDecoder.java:118)     at org.bson.BasicBSONDecoder._decode(BasicBSONDecoder.java:79)     at org.bson.BasicBSONDecoder.decode(BasicBSONDecoder.java:57)     在org.bson.BasicBSONDecoder.readObject(BasicBSONDecoder.java:42)     在org.bson.BasicBSONDecoder.readObject(BasicBSONDecoder.java:32)     ......还有4个

看看实施情况 https://github.com/mongodb/mongo-java-driver/blob/master/src/main/org/bson/LazyBSONDecoder.java看起来它被抓住了

        throw new BSONException( "should be impossible" , ioe );

以上发生在对数据库的查询中(通过查询我的意思是byte []数组包含文档长度之后的所有字节)。查询本身包含字符串“ismaster”或十六进制为“x10 ismaster x00 x01 x00 x00 x00 x00”。我怀疑它是{isMaster:1}的BSON格式,但我仍然不明白它失败的原因。

2 个答案:

答案 0 :(得分:3)

你说:

  

byte []数组包含文档长度

之后的所有字节

如果要剥离返回的BSON的第一部分,则不会将有效的BSON文档传递给解析器/解码器。

有关详细信息,请参阅BSON spec,但在nut-shell中,前四个字节是小端格式的二进制文档的总大小。

您在the code中遇到的异常基本上是在尝试读取预期的字节数。它将第一个int32作为长度读取,然后尝试将其余部分解析为BSON元素(并在下一个字节中找不到有效类型时得到异常)。传递从查询中获得的所有内容,包括文档大小,它将正常工作。

答案 1 :(得分:2)

这很好用:

byte[] array = new BigInteger("130000001069734d6173746572000100000000", 16).toByteArray();
BasicBSONDecoder decoder = new BasicBSONDecoder();
BSONObject bsonObject = decoder.readObject(array);
System.out.println(bsonObject.toString());

并产生此输出:

  

{“isMaster”:1}

byteBuffer中的字节有问题。请注意,必须包含整个文档(包括大小的前4个字节)。