带有TMemoryStream的Delphi XE2 Datasnap对象

带有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",

如何通过datasnap使用TMemoryStream传输ToObject

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;