Rai*_*ido 2 delphi datasnap delphi-xe2
如何通过datasnap传输TObject与TMemoryStream?
TMyObject = class(TBizObject)
FText: TMemoryStream; <-- Content not sent
...
end
Run Code Online (Sandbox Code Playgroud)
在服务器端
TServerMethods.GetMyClass(const AId: Integer): TMyObject
begin
Result := TMyObject.find(AId);
end;
Run Code Online (Sandbox Code Playgroud)
在客户端TMyObject正确解组,但FText内容为空.
TMemoryStream Json内容
"FText": {
"type":"System.Classes.TMemoryStream",
"id":2,
"fields":{
"FCapacity":16384,
"FSize":11788,
"FPosition":11788
}
}
Run Code Online (Sandbox Code Playgroud)
关键是用字段类型*创建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;
Run Code Online (Sandbox Code Playgroud)