2

datasnap を介して TMemoryStream で TObject を転送する方法は?

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

サーバー側で

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

FText コンテンツが空であることを除いて、クライアント側の TMyObject は正しくアンマーシャリングされます。

TMemoryStream Json コンテンツ

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

1 に答える 1

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;
于 2012-04-23T10:46:28.120 に答える