2009-07-22 66 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

相關問題