2012-04-19 2 views
2

datasnap을 통해 TMemoryStream으로 TObject를 전송하는 방법은 무엇입니까? 그 FText 내용을 제외하고 올바르게 정렬 화에서 클라이언트 측 TMyObject에 서버 측Delphi XE2 Datasnap TObject with TMemoryStream

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

TMyObject = class(TBizObject) 
    FText: TMemoryStream; <-- Content not sent 
    ... 
end 

가 비어 있습니다.

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;