2

MongoはBSONを使用しているため、Java APIのBSONDecoderを使用して、MongoクエリからBSONドキュメントを取得し、文字列出力を出力しています。以下では、byte []配列にMongoDBドキュメントのバイトが格納されています(16進値を出力すると、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:org.bson.BasicBSONDecoder $ BSONInput._need(BasicBSONDecoder.java:327)のorg.bson.BasicBSONDecoder $ BSONInput.read(BasicBSONDecoder.java:364)の予期しないEOF。 BasicBSONDecoder.decodeElement(BasicBSONDecoder.java:118)at org.bson.BasicBSONDecoder._decode(BasicBSONDecoder.java:79)at org.bson.BasicBSONDecoder.decode(BasicBSONDecoder.java:57)at 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」が含まれているか、16進数で「x10ismaster x00 x01 x00x00x00x00」です。{isMaster:1}のBSON形式だと思いますが、なぜ失敗するのかまだわかりません。

4

2 に答える 2

3

あなたは言う:

byte []配列には、ドキュメントの長さ以降のすべてのバイトが含まれます

返されたBSONの最初の部分を取り除いている場合は、有効なBSONドキュメントをパーサー/デコーダーに渡していないことになります。

詳細についてはBSON仕様を参照してください。ただし、簡単に言うと、最初の4バイトは、リトルエンディアン形式のバイナリドキュメントの合計サイズです。

基本的に予想されるバイト数を読み取ろうとしているコードで例外が発生しています。最初のint32を長さとして読み取り、残りをBSON要素として解析しようとしました(次のバイトで有効な型が見つからなかった場合は例外が発生しました)。ドキュメントサイズを含め、クエリから返されるすべてのものを渡すと、正しく機能します。

于 2012-08-12T16:33:19.967 に答える
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バイトを含む)を含める必要があることに注意してください。

于 2012-08-12T21:52:02.540 に答える