Delphi 7:将对象转换(序列化?)到TByteDynArray(用于SOAP)

时间:2010-07-02 03:40:14

标签: delphi

我使用Delphi 7并从WDL文件导入以创建SOAP客户端。 Delphi使用WSDL中发布的函数以及这些函数的参数类型(类)生成接口代码。

Delphi已经确定了这样的事情

  Message = class(TRemotable)
  private
    FMessageID: Int64;
    Ftimestamp: TXSDateTime;
    Fevent: eventType;
    FmagicNumber: WideString;
    FDataPart: DataPart;
  published
    property MessageID: Int64 read FMessageID write FMessageID;
    property timestamp: TXSDateTime read Ftimestamp write Ftimestamp;
    property event: eventType read Fevent write Fevent;
    property magicNumber: WideString read FmagicNumber write FmagicNumber;
    property DataPart: DataPart read FDataPart write FDataPart;
  end;

应作为TByteDynArray发送......

function  sendMessage(const theMessage: TByteDynArray; 
                      const data: DataPart): WideString; stdcall;

这需要我将一个对象转换为一个TByteDnyArray,其中包括Delphi n00b - 我这样做是

  theMessageArray := TByteDynArray(theMessage);

当我在调试器中查看对象时,它包含指针(到FtimestampFtimestamp),当我查看TByteDynArray时,我看到自相同的指针值。所以,似乎“演员”不是我想要的。如何将我的对象转换为所需的TByteDynArray? (并且,可能是“内联”指针所指向的对象)

我认为这有一个标准方法......

1 个答案:

答案 0 :(得分:2)

在父类中查找流式传输数据的方法。 objectinstance.savetostream左右。它可能会迭代已发布的元素并将它们写入流中。

使用它将它写入内存流,它大致是一个围绕内存块的类(如tdynbytearray)。然后使用memorystream.size和setlength将tbytedynarray分配给适当的大小,并将字节从memorystream复制到新创建的数组中:

 // (Untested)

 memstream:=TMemoryStream.Create;
 objectinstance.SaveToStream(memstream);
 setlength(mybytearray,memstream.size);
 if memstream.size>0 then
    move (pansichar(memstream.memory)^,mybytearray[0],memstream.size);