1

我必须在 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方法?有一些指令可以在初始化时更改,不会让孤儿对象?

4

0 回答 0