2012-04-19 106 views
2

如何通过datasnap与TMemoryStream传输TObject?德尔福XE2 Datasnap TObject与TMemoryStream

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

上,除了用FText内容服务器端

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

在客户端TMyObject正确地解组是空的。

内存流的Json内容

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

查看'MarshalUnmarshal'示例项目。 – 2012-04-19 11:03:59

+0

我已经看过,知道如何注册转换器的对象字段。问题是,我有很多对象,我需要(实际上需要)全局注册TMemoryStream转换器。或者我错过了什么? – Raido 2012-04-19 12:58:20

回答

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;