Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 7:将对象转换(序列化?)为TByteDnarray(用于SOAP)_Delphi - Fatal编程技术网

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

Delphi 7:将对象转换(序列化?)为TByteDnarray(用于SOAP),delphi,Delphi,我使用Delphi7并从WDL文件导入来创建SOAP客户端。Delphi使用WSDL中发布的函数以及这些函数的参数类型(类)生成接口代码 德尔福已经确定了类似这样的事情 Message = class(TRemotable) private FMessageID: Int64; Ftimestamp: TXSDateTime; Fevent: eventType; FmagicNumber: WideString; FDataPart: DataP

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

德尔福已经确定了类似这样的事情

  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;
应作为TByterray发送

function  sendMessage(const theMessage: TByteDynArray; 
                      const data: DataPart): WideString; stdcall;
这就需要我将一个对象转换为TByteDnyArray,这是-n00b-我通过

  theMessageArray := TByteDynArray(theMessage);
当我在调试器中查看对象时,它包含指针(指向
Ftimestamp
Ftimestamp
),当我在tbytednarray中查看时,我会看到自同的指针值。所以,“演员”似乎不是我想要的。如何将我的对象转换为所需的TByterray?(大概是指针指向的对象的“内联线”)


我假定有一种标准的方法来实现这个…

在父类中查找数据流的方式。objectinstance.savetostream等。它可能会迭代已发布的membe并将它们写入流

使用此命令将其写入内存流,该内存流大致是围绕内存块的一个类(如tdynbytearray)。然后使用memorystream.size和setlength将TByteDnArray分配到适当的大小,并将字节从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);

+1的回复,但这会“把”它抛给一个TByterray吗?我还需要确保它可以用作SOAP调用的参数。不,将一个类强制转换为其他类是不可能的。这被称为流式传输,这是完成此操作的常用方法+1 Marco,是的,我知道,但让我担心的是,我可能不得不编写、尝试调用远程过程,结果失败。这将留下许多棘手的调试。在我看来,如果Delphi本身在解析WSDL文件时生成了一个采用TByteDnarray而不是对象的接口,那么应该有一种标准的转换方法(我在Google上搜索了&找不到任何有用的示例),父类TRemotable似乎没有任何方法保存到流。我想我必须自己编写代码嗯,是不是有一个现成的TCustomMemoryStream子体,它将指针设置到TbyteDnarray开始的数据指针位置?(如果没有,也不难制作)