我必须在 Web 服务中调用一个方法,该方法接收一个对象作为参数,但由于许多原因,我必须创建一个 XML,然后使用 SoapToObject 将其转换为正确调用该方法。
问题是,其中一个属性的方法需要一个整数值,但它对应的 XML 标记带有一个非整数值(如“1-2”或“1/2”),它会导致 SoapToObject 出现错误,即在其中生成孤立对象,然后我无法杀死它,因此泄漏越来越多并导致 COM+ 冻结,需要手动杀死 dllhost 进程
类代码示例(请考虑所有创建和析构函数都已按正确顺序完成):
TObject1GrandSon = class(TRemotable)
ngs: string;
end;
TObject1Son = class(TRemotable)
obj1g: TObject1GrandSon;
end;
TObject1 = class(TRemotable)
ns1: string;
obj1s: TObject1Son;
end;
TObject2Son = class(TRemotable)
ns2: string;
end;
TObject2 = class(TRemotable)
obj2s: TObject2Son;
end;
TObject3 = class(TRemotable)
ns3: string;
end;
TMain = class(TRemotable)
n1: string;
obj1: TObject1;
obj2: TObject2;
n2: integer;
obj3: TObject3;
end;
TReturn = class(TRemotable);
相应的 XML 示例:
XMLEntry:= '
<main>
<n1>Text 1</n1>
<obj1>
<ns1>Text 2</ns1>
<obj1s>
<obj1g>
<ngs>Text 3</ngs>
</obj1g>
</obj1s>
</obj1>
<obj2>
<obj2s>
<ns2>Text 4</ns2>
</obj2s>
</obj2>
<n2>1-1</n2>
<obj3>
<ns3>Text 5</ns3>
</obj3>
</main>';
代码调用示例:
var
rio: THTTPRIO;
Entry: TMain;
Return: TReturn;
iXML: IXMLDocument;
begin
iXML:= NewXMLDocument;
iXML.LoadFromXML(XMLEntry);
rio:= THTTPRio.Create(nil);
Entry:= TMain.Create;
try
Entry.SOAPToObject(iXML.DocumentElement, iXML.DocumentElement, rio.Converter);
ws:= GetWS_PortType(false, url, rio);
Return:= nil;
try
Return:= ws.Method1(Entrada);
finally
Return.Free;
end;
finally
Entry.Free;
end;
end;
因此,考虑到以上所有代码,将引发异常“'1-1'' is not a valid integer value”,然后已经创建的对象“obj1”(包括对应的对象“obj1s”和“ obj1g") 和 "obj2" 将是孤立的,并将显示在 MemoryLeaks 窗口中。
有什么解决办法吗?有没有办法改变serealization方法?有一些指令可以在初始化时更改,不会让孤儿对象?