有人可以为 Delphi 推荐一个完整的 Bson 库吗?我正在尝试使用http://bsonspec.org中的http://code.google.com/p/pebongo/source/browse/trunk/_bson.pas,但有些结构不受支持。
或者我没有正确使用它,就像这个类没有文档我找不到它的正确用法。
我想创建一个项目列表,这些项目是我的可序列化对象。
但是如何创建一个列表并将项目放在“列表”上?
有人可以为 Delphi 推荐一个完整的 Bson 库吗?我正在尝试使用http://bsonspec.org中的http://code.google.com/p/pebongo/source/browse/trunk/_bson.pas,但有些结构不受支持。
或者我没有正确使用它,就像这个类没有文档我找不到它的正确用法。
我想创建一个项目列表,这些项目是我的可序列化对象。
但是如何创建一个列表并将项目放在“列表”上?
我之前为 Delphi 创建了一个 BSON 实现,很大程度上基于 Delphi 中现有的 Variant 类型(及其 TVarType)。它在某种程度上还支持变体数组。
参见 bsonDoc.pas: https ://github.com/stijnsanders/TMongoWire
我遇到了同样的麻烦,并且稍微修改了源代码。这是我当时做的:
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;
我不欣赏“免费”方法的实现方式,并删除了所有这些方法,并在适合的地方相应地引入了新的“销毁”析构函数方法。
我希望它会对你有所帮助。