7

誰かがDelphi用の完全なBsonライブラリを提案できますか?http://bsonspec.orgのhttp://code.google.com/p/pebongo/source/browse/trunk/_bson.pasを使用しようとしていますが、サポートされていない構造がいくつかあります。


または、このクラスにドキュメントがないため、正しく使用されていない可能性があります。正しい使用法を見つけることができません。

アイテムのリストを作成したいのですが、このアイテムはシリアル化可能なオブジェクトです。
しかし、リストを作成してアイテムを「リスト」に入れる方法は?

4

2 に答える 2

7

以前、Delphi の既存のバリアント型 (およびその TVarType) に大きく基づいて、Delphi 用の BSON 実装を作成しました。また、ある時点でバリアント配列もサポートしています。

bsonDoc.pas を参照してください: https://github.com/stijnsanders/TMongoWire

于 2011-06-07T11:47:58.457 に答える
1

私は同じ問題に遭遇し、ソースコードを少しハッキングしました。その時作ったのが以下です。

procedure TBSONDocument.ReadStream(F: TStream);
var
  len : Integer;
  elmtype : Byte;
  elmname : string;
begin
  Clear;

  F.Read(len, SizeOf(len));
  F.Read(elmtype, SizeOf(Byte) );

  while elmtype <> BSON_EOF do
  begin
    elmname := _ReadString(F);

    SetLength(FItems, Length(FItems)+1);

    case elmtype of
      BSON_FLOAT: FItems[High(FItems)] := TBSONDoubleItem.Create;
      BSON_STRING: FItems[High(FItems )] := TBSONStringItem.Create;
      BSON_DOC: FItems[High(FItems )] := TBSONDocumentItem.Create;  // Mrsky
      BSON_ARRAY: FItems[High(FItems)] := TBSONArrayItem.Create;
      BSON_BINARY: FItems[High(FItems)] := TBSONBinaryItem.Create;

      BSON_OBJECTID: FItems[High(FItems )] := TBSONObjectIDItem.Create;
      BSON_BOOLEAN: FItems[High(FItems )] := TBSONBooleanItem.Create;
      BSON_DATETIME: FItems[High(FItems)] := TBSONDatetimeItem.Create(0); // Mrsky

      BSON_REGEX: FItems[High(FItems)] := TBSONRegExItem.Create;
      BSON_DBPTR: FItems[High(FItems)] := TBSONDBRefItem.Create;
      BSON_JS: FItems[High(FItems )] := TBSONJSItem.Create;
      BSON_SYMBOL: FItems[High(FItems)] := TBSONSymbolItem.Create;
      BSON_JSSCOPE: FItems[High(FItems )] := TBSONScopedJSItem.Create;

      BSON_INT32: FItems[High(FItems )] := TBSONIntItem.Create;

      BSON_INT64: FItems[High(FItems )] := TBSONInt64Item.Create;

      BSON_MINKEY: FItems[High(FItems)] := TBSONItem.Create(BSON_MINKEY);
      BSON_MAXKEY: FItems[High(FItems)] := TBSONItem.Create(BSON_MAXKEY);

    else
      raise EBSONException.Create('Unimplemented element handler '+IntToStr(elmtype));
    end;

    with FItems[High(FItems)] do
    begin
      elname := elmname;
      ReadStream(f);
    end;

    f.Read(elmtype, SizeOf(Byte));
  end;
end;

「Free」メソッドの実装方法が気に入らなかったので、それらをすべて削除し、それに応じて新しい「Destroy」デストラクタ メソッドを導入しました。

少しでもお役に立てれば幸いです。

于 2011-09-20T14:57:08.240 に答える