Почему определенные методы Delphi SOAP RTL OpConvert.pas не рекомендуется использовать, если они используют String вместо Stream в качестве типа документа XML? - PullRequest
3 голосов
/ 28 марта 2012

В моем коде есть предупреждение, что я не могу понять, как удалить. Этот метод представляет собой служебный метод, который вызывает метод IOPConvert.ProcessResponse поля THonTPrio для поля FConverter.

Существует несколько перегруженных версий ProcessResponse в IOPConvert, и та, которая объявлена ​​с параметром типа InvString в качестве первого параметра, является устаревшей.

В Delphi SOAP RTL наблюдается тенденция отхода от типов String до типов потоков, начиная с Delphi 7 и до настоящего времени (Delphi XE / XE2).

Вопрос в том, ПОЧЕМУ? В этом случае я даже не могу понять, как преобразовать мой вспомогательный код, если я не добавлю некрасивую оболочку потока строк:

TRIOHelper = class helper for THTTPRIO
    public
        function HelperMethod(aMethName: String; aSoapString: String) : TRemotable;
    end;

function TRIOHelper.HelperMethod(aMethName, aSoapString: String): TRemotable;
var 
   tmpString:String;
begin 
     //FConverter is a field in THTTPRIO
     tmpStr := GrievousXmlHackery(aSoapString);
     FConverter.ProcessResponse(InvString(tmpStr), IntfMD, MethMD, FContext);
     ...
end;

Код над устаревшим вызовом настраивает документ XML (ответ SOAP) и удаляет некоторые проблемные элементы из входящего потока. Да, взломать. Как я должен изменить это, и почему строки плохо в OpConvert?

Полагаю, мне нужно создать оболочку String Stream или Memory Stream для tmpString? Обратите внимание, что в моем случае функция GrievousXmlHackery удаляет тег <encoding> при его наличии из SOAP по злым причинам, которые здесь не важны.

Если не существует чего-то технически НЕПРАВИЛЬНОГО со старыми методами и apis на основе строк, я собираюсь смириться с предупреждением. Но если (как и во многих местах в VCL) устарелое предупреждение также означает «здесь будут драконы», я хотел бы знать об этом.

1 Ответ

1 голос
/ 28 марта 2012

Я не знаком с реализацией SOAP в Delphi, но почему бы вам просто не использовать TStringStream вместо этого?

function TRIOHelper.HelperMethod(aMethName, aSoapString: String): TRemotable;
var 
  Strm: TStringStream;

begin 
     //FConverter is a field in THTTPRIO
     Strm := TStringStream.Create(GrievousXmlHackery(aSoapString));

     // or
     // Strm := TStringStream.Create('');
     // Strm.DataString := GreviousXmlHackery(aSoapString);

     FConverter.ProcessResponse(Strm, IntfMD, MethMD, FContext);
     // Not sure if you or THTTPRIO is responsible for releasing the stream
     ...
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...