Delphi的Bson库?

时间:2011-06-06 20:28:53

标签: delphi bson

有人可以为Delphi建议一个完整的Bson库吗? 我正在尝试使用http://code.google.com/p/pebongo/source/browse/trunk/_bson.pas中的http://bsonspec.org,但有些结构不受支持。


或许我没有正确使用它,就像这个类没有文档我找不到它的正确用法。

我想创建一个项目列表,这些项目是我的可序列化对象 但是如何创建一个列表并将项目放在“列表”上?

2 个答案:

答案 0 :(得分:7)

之前我为Delphi创建了一个BSON实现,主要基于Delphi中现有的Variant类型(及其TVarType)。它还支持变量数组。

参见bsonDoc.pas: https://github.com/stijnsanders/TMongoWire

答案 1 :(得分: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”析构函数方法。

我希望它对你有所帮助。