2011-06-06 30 views
7

Birisi Delphi için eksiksiz bir Bson kütüphanesi önerebilir mi? http://code.google.com/p/pebongo/source/browse/trunk/_bson.pas'u http://bsonspec.org'dan kullanmaya çalışıyorum, ancak desteklenmeyen bazı yapılar var.Bson kütüphanesi?


Ya da doğru şekilde kullanmıyorum, bu sınıftaki belgeler gibi doğru kullanım bulamıyorum.

Öğelerin bir listesini oluşturmak istiyorum, bu öğeler benim serileştirilebilir nesnelerimdir.
Ama nasıl bir liste oluşturmak ve bir öğe "liste" üzerine koymak?

+0

"Desteklenmiyor" ?! –

+0

Hangi Delphi kütüphanesini kullanıyorsunuz ve ihtiyacınız olan BSON özellikleri desteklenmiyor mu? –

+0

Kütüphane, aşağıda ve yayınladığım özellikte. –

cevap

7

Delphi'de var olan Variant türüne (ve onun TVarType'sine) dayalı olarak daha önce Delphi için bir BSON uygulaması oluşturdum. Ayrıca varyant dizileri bir noktaya kadar destekler. https://github.com/stijnsanders/TMongoWire

+0

Nesnelerin bir listesini serileştirmem, ağ üzerinden göndermem ve daha sonra yeniden seri hale getirmem gerekiyor. Uygulamanla yapabilir miyim? – Haruki

+0

@Hrukai İş arkadaşım kim –

1

Aynı sorun rastladı ve kaynak kodunu biraz kesmek:

bsonDoc.pas görüyoruz. İşte ben o zaman pişmiş ne: nerede uygun

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; 

Yol "Ücretsiz" yöntemi hayata geçirildi takdir ve hepsi kaldırmak ve yeni tanıtılan vermedi buna göre yıkıcı yöntemi "Yok".

Umarım sizin için biraz yardımcı olacaktır.