2012-04-19 6 views
2

TMemoryStreamでTObjectをdatasnapで転送するにはどうすればいいですか?クライアント側TMyObjectでDelphi XE2 Datasnap TObject with TMemoryStream

TMyObject = class(TBizObject) 
    FText: TMemoryStream; <-- Content not sent 
    ... 
end 
サーバー側の

TServerMethods.GetMyClass(const AId: Integer): TMyObject 
begin 
    Result := TMyObject.find(AId); 
end; 

FTEXT内容が空であることを除いて、正しくアンマーシャリングインチ

TMemoryStream JSONコンテンツ

"FText": { 
     "type":"System.Classes.TMemoryStream", 
     "id":2, 
     "fields":{ 
      "FCapacity":16384, 
      "FSize":11788, 
      "FPosition":11788 
     } 
    } 
+0

「MarshalUnmarshal」サンプルプロジェクトをご覧ください。 –

+0

私はすでにそれを見て、オブジェクトフィールドのコンバータを登録する方法を知っています。問題は、私は多くのオブジェクトを持っており、TMemoryStreamコンバータをグローバルに登録する必要があることです。または私は何かを逃したか? – Raido

答えて

5

キーは、フィールドタイプ*でTConverterEventとTReverterEventを作成することでした。ソースコードを持たずに解決策を見つけることは困難でした。

procedure RegisterDatasnapConvertersAndReverters; 
var 
    LConverter: TConverterEvent; 
    LReverter: TReverterEvent; 
begin 
    LConverter := TConverterEvent.Create(TMemoryStream, '*' {FIELD_ANY}); 
    LConverter.TypeStringConverter := function (Data: TObject): string 
    var 
     stream: TMemoryStream; 
    begin 
     stream := TMemoryStream(Data); 
     stream.Position := 0; 
     Result := EncodeBase64(stream.Memory, stream.Size); 
    end; 
    TJSONConverters.AddConverter(LConverter); 

    LReverter := TReverterEvent.Create(TMemoryStream, '*' {FIELD_ANY}); 
    LReverter.TypeStringReverter := function(Data: string): TObject 
    var 
     bytes: TBytes; 
    begin 
     bytes := DecodeBase64(Data); 
     Result := TMemoryStream.Create; 
     if nil <> bytes then 
     TMemoryStream(Result).WriteBuffer(bytes[0], Length(bytes)); 
    end; 
    TJSONConverters.AddReverter(LReverter); 
end; 

initialization 
    RegisterDatasnapConvertersAndReverters; 
関連する問題