Delphi 7:将对象转换(序列化?)为TByteDnarray(用于SOAP)
我使用Delphi7并从WDL文件导入来创建SOAP客户端。Delphi使用WSDL中发布的函数以及这些函数的参数类型(类)生成接口代码 德尔福已经确定了类似这样的事情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
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开始的数据指针位置?(如果没有,也不难制作)