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

3

我使用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新手,所以我正在通过以下方式进行转换:

  theMessageArray := TByteDynArray(theMessage);

当我在调试器中查看对象时,它包含指针(指向和),当我查看TByteDynArray时,我看到的是相同的指针值。因此,似乎“转换”不是我想要的。如何将我的对象转换为所需的TByteDynArray?(并且,可能会“内联”指针指向的对象)
我认为这方面有一种标准方法...
1个回答

2

在父类中查找一种流式传输数据的方法。可能是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);

+1 表示回复,但这会将其“转换”为 TByteDynArray 吗?我需要确保它可以用作 SOAP 调用的参数。 - Mawg says reinstate Monica
1
不,将一个类转换为除另一个类以外的任何东西是不可能的。这被称为流式处理,这是通常的处理方式。 - Marco van de Voort
+1 Marco,是的,我知道,但让我担心的是我可能需要编写、尝试调用远程过程并失败。那将留下很多棘手的调试工作。在我看来,如果Delphi本身在解析WSDL文件时生成一个接口,该接口采用TByteDynArray而不是对象,则应该有一种标准的方法来转换(我已经搜索了谷歌,但找不到任何有用的示例) - Mawg says reinstate Monica
父类TRemotable似乎没有任何方法可以保存到流中。我想我必须编写自己的代码。 - Mawg says reinstate Monica
哦,没有一个现成的TCustomMemoryStream的后代可以将指针设置为TByteDynArray开头的数据指针位置吗?(如果没有,那也不难制作) - Stijn Sanders

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接