2009-07-22 82 views
2

在Delphi 2007中是否存在可复制TRemotable对象(或后代)的强大机制?在Delphi 2007中制作TRemotable对象副本的强大方法

我创建了一个Delphi Web服务客户端,它从Web服务接收各种对象;当然,都是TRemotable的后代。在客户端中,我创建了一个匹配对象,然后将提供的TRemotable的Web服务中的所有属性复制到我自己的对象中。这是通过TypInfo.GetPropList()完成的,然后是一个围绕TypInfo的循环。 GetPropValue()和TypInfo.SetPropValue()方法调用。虽然这对于简单类型(字符串,ints,bool等)非常适用,但它不适用于复杂类型,如日期,时间或子对象类型。我假设,如果Web服务使用新的复杂类型,我的复制代码也会中断。

看起来像一种可能性是将对象序列化为XML文档,然后将其读入新对象。但是,这似乎是一个很大的开销,只是复制一系列的属性。

回答

2

发现了一个更强大的解决方案,似乎为简单的类型,TXS ...派生类型和子对象类型做工精细:

procedure CopyNormal(Source, Target: TRemotable); 
var 
    Converter: IObjConverter; 
    NodeObject: IXMLNode; 
    NodeParent: IXMLNode; 
    NodeRoot: IXMLNode; 
    XML: IXMLDocument; 
    XMLStr: WideString; 
begin 
    XML:= NewXMLDocument; 
    NodeRoot:= XML.AddChild('Root'); 
    NodeParent:= NodeRoot.AddChild('Parent'); 
    Converter:= TSOAPDomConv.Create(NIL); 
    NodeObject:= Source.ObjectToSOAP(NodeRoot, NodeParent, Converter, 'CopyObject', '', [ocoDontPrefixNode], XMLStr); 
    Target.SOAPToObject(NodeRoot, NodeObject, Converter); 
end; 
0

TDateTime只是一个不同名称的Double,你应该能够毫无困难地复制它。或者你在日期和时间中使用其他格式?

至于子对象,它们可以通过使您的复制例程递归来处理。如果遇到属性是一个对象,让它创建该对象的副本并将其分配给父对象。 (注意:只有在子对象也有公开属性的情况下才能使用)。

+0

TDateTime类型是原生Delphi代码的两倍。但不是当它是TREMotable属性时;在这种情况下,这是一个TXSDateTime。它看起来像我的复制代码打破了任何TXS ...类型。 – 2009-07-22 20:48:02

0

是的,您可以使副本递归,但仍然会给您带来问题,如何复制内部专用字段。你将不得不公开所有领域的属性,在我看来,这是不干净,麻烦。

我肯定会序列化对象。 SOAP自身有很多开销,相比之下,序列化速度非常快。我甚至会争辩说使用REST的简单HTTP方法会更好。

你可以看看我的SimpleStorage框架是在考虑这些任务(序列化)的情况下做出的。特别看看适配器的功能。

你可以得到它:http://www.cromis.net/blog/downloads/

也有文章有没有说明如何使用它。如果您已经在使用其他XML库并且不想切换,那么如果我是你,我仍然更喜欢序列化方法。

我怀疑你可以在30ms以内完成一个http请求。序列化会比这更少。现在添加SOAP开销,你是超级快相比,它:)

+0

我并不担心私人财产。这些TRemotable-descendant对象由WSDLImp.exe构建,除了已发布的属性外都没有。如果我使用自己的私有属性创建自己的后代,那么我唯一有兴趣复制的属性就是原始发布的属性。 – 2009-07-23 15:18:22

+0

HTTP + REST方法也不起作用; Web服务不在我的控制之下,SOAP是唯一的方法。 – 2009-07-23 15:20:18

相关问题