delphi - 如果某些 Delphi SOAP RTL OpConvert.pas 方法使用 String 而不是 Stream 作为其 XML 文档类型,为什么它们会被弃用?

标签 delphi soap stream

我的代码中有一个警告,我不知道如何删除。该方法是一个实用程序方法,调用 THTTPRIO 的 FConverter 字段的 IOPConvert.ProcessResponse方法。

IOPConvert 中有多个 ProcessResponse 的重载版本,其中一个是使用参数类型 InvString 声明的版本。因为第一个参数已被弃用。

在整个 Delphi SOAP RTL 中,从 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 中的字符串不好?

我想我需要为 tmpString 制作一个字符串流或内存流包装器?请注意,在我的例子中,GrievousXmlHackery 函数删除了 <encoding>标签(如果存在)出于邪恶原因从 SOAP 中删除,但在这里仍然不重要。

除非旧方法和基于字符串的 api 在技术上确实存在错误,否则我将忍受该警告。但是如果(像 VCL 中的许多地方一样),已弃用的警告也意味着“这里有龙”,我想知道它。

最佳答案

我不熟悉 Delphi 的 SOAP 实现,但为什么不能直接使用 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;

关于delphi - 如果某些 Delphi SOAP RTL OpConvert.pas 方法使用 String 而不是 Stream 作为其 XML 文档类型,为什么它们会被弃用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9896823/

相关文章:

soap - PHP 通过浏览器处理 SOAP 请求很慢,但在命令行上很好

c# - 如何通过SOAP注册设备?

android - OutputStreamWriter 的 flush 方法在尝试写入汉字时抛出 IOException

delphi - 重新引入 Delphi 中的函数

c# - Stream.CopyTo 不复制任何流数据

regex - 使用 Scala Iterator 使用 RegEx 匹配将大流(来自字符串)分解为 block ,然后对这些 block 进行操作?

Java 字符串与流

delphi - 为什么 Delphi TTreeNodes 从根本上与 TCustomTreeView 绑定(bind)?

database - 在不同表中使用相同字段名称的问题,特别是ID

c++ - 在 C++ 和 Delphi DLL 之间传递 PChar/*char