Delphi 7 : Converting (serializing? ) TByteDynArray 的对象(用于 SOAP)

标签 delphi

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

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 时,我看到 self相同的指针值。所以,看来“ Actor ”并不是我想要的。如何将我的对象转换为所需的 TByteDynArray? (并且大概“内联”指针指向的对象)

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

最佳答案

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

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

 // (Untested)

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

关于Delphi 7 : Converting (serializing? ) TByteDynArray 的对象(用于 SOAP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3163116/

相关文章:

delphi - 类类型和构造函数调用

delphi - 在 Delphi 中使用 StretchDraw 方法拉伸(stretch)位图

delphi - 缩写进度条

multithreading - Delphi XE 中的多线程有哪些新功能?

delphi - 使用默认值时,rtti 不调用所需的重载函数

delphi - 在图像上写入透明文本

sql-server - 获取存储过程的进度

德尔福 2007 和 Windows 7 : Debugger fails to stop host application

freepascal - 在哪里可以找到循环缓冲区的良好 Delphi 或 Object Pascal 实现

delphi - 动态改变CreateParams?