带有TMemoryStream的Delphi XE2 Datasnap对象
如何通过datasnap使用TMemoryStream传输ToObject带有TMemoryStream的Delphi XE2 Datasnap对象,delphi,delphi-xe2,datasnap,Delphi,Delphi Xe2,Datasnap,如何通过datasnap使用TMemoryStream传输ToObject TMyObject = class(TBizObject) FText: TMemoryStream; <-- Content not sent ... end 在客户端,除了FText内容为空外,中的TMyObject已正确解组 TMemoryStream Json内容 "FText": { "type":"System.Classes.TMemoryStream",
TMyObject = class(TBizObject)
FText: TMemoryStream; <-- Content not sent
...
end
在客户端,除了FText内容为空外,中的TMyObject已正确解组
TMemoryStream Json内容
"FText": {
"type":"System.Classes.TMemoryStream",
"id":2,
"fields":{
"FCapacity":16384,
"FSize":11788,
"FPosition":11788
}
}
关键是创建字段类型为*的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;
过程寄存器数据转换器和转换器;
变量
LConverter:tConvertRevent;
LReverter:TReverterEvent;
开始
LConverter:=tConvertRevent.Create(TMemoryStream,'*'{FIELD\u ANY});
LConverter.TypeStringConverter:=函数(数据:ToObject):字符串
变量
流:TMemoryStream;
开始
流:=TMemoryStream(数据);
流位置:=0;
结果:=EncodeBase64(stream.Memory,stream.Size);
结束;
TJSONConverter.AddConverter(LConverter);
LReverter:=TReverterEvent.Create(TMemoryStream,'*'{FIELD_ANY});
LReverter.TypeStringReverter:=函数(数据:字符串):ToObject
变量
字节:TBytes;
开始
字节:=DecodeBase64(数据);
结果:=TMemoryStream.Create;
如果为零字节,则
TMemoryStream(Result).WriteBuffer(字节[0],长度(字节));
结束;
TJSONConverters.AddReverter(LReverter);
结束;
初始化
注册数据转换器和转换器;
看看MarshalUnmarshal
示例项目。我已经看过了,并且知道如何为对象字段注册转换器。问题是,我有很多对象,我需要(实际上想要)全局注册TMemoryStream转换器。还是我错过了什么?
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;