2011-06-06 9 views
7

¿Alguien puede sugerir una biblioteca Bson completa para Delphi? Estoy tratando de usar http://code.google.com/p/pebongo/source/browse/trunk/_bson.pas desde http://bsonspec.org, pero hay algunas estructuras que no son compatibles.Biblioteca Bson para Delphi?


O tal vez no lo estoy usando correctamente, como esta clase no tiene documentación, no puedo encontrar el uso correcto para ella.

Quiero crear una lista de elementos, estos artículos son mis objetos serializables.
¿Pero cómo crear una lista y poner el elemento en una "lista"?

+0

"No son compatibles"? –

+0

¿Qué biblioteca de Delphi está utilizando y qué características de BSON que necesita no son compatibles? –

+0

La biblioteca está en el enlace y la función que publiqué a continuación. –

Respuesta

7

He creado una implementación de BSON para Delphi anteriormente, basada en gran medida en el tipo de Variant existente en Delphi (y su TVarType). También es compatible con variant-arrays en algún punto.

ver bsonDoc.pas: https://github.com/stijnsanders/TMongoWire

+0

Necesito serializar una lista de objetos, enviarla a través de la red y deserializarla después. ¿Puedo hacerlo con tu implementación? – Haruki

+0

@Hrukai Quien sea mi compañero de trabajo –

1

me encontré con el mismo problema y cortaron el código fuente un poco. Esto es lo que cocinaba a continuación:

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; 

no me ha gustado la forma en que se implementó el método "libre" y retire todos ellos e introdujeron nuevas "Destruir" método destructor en consecuencia cuando se ajuste.

Espero que sea de alguna ayuda para usted.