`
neo
  • 浏览: 265539 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

PHPRPC for Delphi 中的容器类型

阅读更多
转自http://coolcode.cn/?action=show&id=318

尽管 Delphi 的 VCL/CLX 中提供了一些容器类型(比如 TList,TObjectList,TStringList 等),但是这些容器要么是针对指针的(无所不包),要么是针对对象的(基本类型就无法存了),甚至是针对某种特殊类型的(这样就限制就更大了)。所以这些容器类型与其它语言中的列表或字典类容器进行直接交换就存在一些问题了,不是包括的范围太大就是范围太小。

所以,在 PHPRPC for Delphi 中,专门提供了一组用于跟其它语言交换数据的又方便操作的容器类型。下面就对这些类型做一下详细的介绍。

首先第一个要介绍的是 Delphi 的动态数组类型,这个不是 PHPRPC for Delphi 中提供的,而是 Delphi 自己提供的。比如 TIntegerDynArray,TWordDynArray,TDoubleDynArray 等,这些是在 Delphi 的 Types 单元中定义的,如果需要直接引用这个单元就可以使用这些类型。

不过有两点要注意,第一是 TStringDynArray(array of string),它在通过 PHPRPC 传输的时候可能并不像你希望的那样工作,因为 Delphi 本身会将其中的字符串转换成 OLEStr 来进行传递,如果你的 String 是二进制字符串,而不是本地编码的文本,最后的结果可能就不是你期望的了。所以在跟其它语言进行数据交互时,不推荐使用动态字符串数组类型。

第二是 TByteDynArray(array of Byte),为了优化该类型传输,该类型会以 AnsiString(RawByteString)方式序列化传输。在被反序列化时,也会被作为 AnsiString 类型被反序列化。如果希望结果被直接反序列化为 TByteDynArray 类型,则可以将 TPHPRPC_Client 对象的 StringAsByteArray 属性设置为 True 即可。但对于自定义类型的属性,不论是 AnsiString 还是 TByteDynArray 类型,都无需设置 StringAsByteArray,PHPRPC 会自动按照正确的类型反序列化。

PHPRPC for Delphi 除了支持动态数组外,还提供了更加高级的容器类型,它们是 TArrayList,THashedArrayList 和 THashMap。另外,还有一个字符串操作的帮助类 TStringBuffer。

TArrayList 类似于动态数组 TVariantDynArray,可以保存的元素也是 Variant 类型,但是 TArrayList 提供了一些方法允许你方便的添加、删除、查找、修改、移动元素,并且容器大小是可自动增长的。

THashedArrayList 是 TArrayList 的一个子类,它跟 TArrayList 实现的操作是一样的,不过它在存取下标不连续的数组时,效率更高。IndexOf 操作效率也更高,THashedArrayList 效率为 O(1),而 TArrayList 为 O(n)。

THashMap 可以让你通过一个 Variant 变量来索引另一个 Variant 变量,不过通常用来做索引的是整数或者字符串。如果要通过 PHPRPC 传递的话,那么索引必须是整数或字符串类型,其他类型的索引会被忽略。

通过 PHPRPC 调用其它语言发布的服务时,如果其它语言返回的类型是数组、列表或者字典等类型的数据,在 Delphi 中接收到之后都会作为 THashMap 返回,如果接收到的是一个对象类型,当这个对象类型在 Delphi 中没有对应的定义时,也将作为 THashMap 返回。如果你希望以 TArrayList 来操作返回值,可以用 THashMap 的 ToArrayList 方法将结果转换为 TArrayList 类型,这个 ToArrayList 返回的是一个独立的 TArrayList 对象,使用后注意要用 Free 方法将它释放,否则会产生内存泄漏。

TStringBuffer 就不用详细介绍了,它没有什么特别的,就是一个用来可以方便修改二进制字符串的帮助类,通过它的 ToString 方法可以得到最后的字符串。

这些类型都是 TPHPObject 的子类,都可以转化成 Variant 类型。了解了这些容器类型以后,用 PHPRPC for Delphi 写程序就会方便多了。
分享到:
评论

相关推荐

    phprpc_3.0_delphi.zip_Free!_PHPRPC delp_PHPRPC for delp_delphi

    PHPRPC for Delphi 对容器类型的支持 PHPRPC for Delphi 对自定义类型的支持 另外,PHPRPC 还提供了 Lazarus(Free Pascal)版本,Lazarus 与 Delphi 很像,你可以认为它是一个开源版本的 Delphi。只不过现在的 ...

    phprpc_3.0.1_delphi

    1. **Library Files**: Delphi编译的动态链接库(DLL)或静态链接库(LIB),用于在Delphi项目中导入和使用Phprpc功能。 2. **Header Files**: 定义了接口和数据结构的头文件(.h或.pas),方便开发者在Delphi代码中...

    phprpc_3.0.2_delphi_Edit_XE2

    在这个特定的版本"phprpc_3.0.2_delphi_Edit_XE2"中,重点是针对Embarcadero Delphi开发环境的一个定制编辑版,特别适配于XE2版本。这表明该版本是为使用Delphi XE2的开发者设计的,旨在方便他们在PHP和Delphi之间...

    phprpc for .net

    phprpc for .net 源代码都有,可修改

    phprpc for java 服务器实例

    在本实例中,我们将深入探讨如何在Java环境中设置和使用Phprpc服务器,以便理解其核心概念和操作流程。 1. **Phprpc简介** Phprpc是一种高效、轻量级的RPC解决方案,它支持多种编程语言,包括PHP和Java。通过这个...

    PHPRPC3.0分享

    在IT行业中,RPC技术是分布式系统中的关键组件,它允许一个程序调用另一个运行在不同地址空间(可能在另一台机器上)的程序,就像是在本地调用一样。PHPRPC3.0特别强调了性能和安全性,使得开发者可以轻松地构建跨...

    phprpc中文文档

    Phprpc是一个轻量级的PHP远程过程调用(RPC)框架,它允许开发者在不同的PHP进程中进行通信,实现服务间的高效数据交换。这个中文文档是对于Phprpc框架的详细解释,对于初学者和进阶用户都非常有用。文档包含了框架...

    解决Delphi XML-RPC 中文乱码、结构/数组等没有解析I4项BUG

    最近要用XML-RPC机制实现delphi程序与Qt程序之间的通信,从...下载Delphi XML-RPC 后发现中文字符串会出现乱码,跟踪代码后发现XML-RPC默认的 字符编码是UTF-8,而且QT也都是用UTF-8编程,故把传输字符串改为UTF-8就行了。

    基于IOCP的远程函数调用(RPC)

    在提供的压缩包文件中,"RPC(delphi10.1).exe"可能是已经编译好的RPC服务端和客户端示例程序,"安装完成后.png"可能是安装过程的截图,展示如何配置和启动服务。"生成模块.png"可能显示的是如何在Delphi环境中生成...

    PHPRPC .Net服务端+客户端

    标签中的"PHPRPC For ."可能表示这个版本是专门为.NET环境设计的,这意味着它可以与其他.NET语言(如C#、VB.NET等)无缝集成。 在实际应用中,PHPRPC可以用于以下场景: 1. **混合架构**:在PHP和.NET项目并存的...

    phprpc调用示例

    phprpc 的delphi调用 一般常用的调用方法 htdocs http://127.0.0.1/ 为WEB根目录 PHPRPC演示 php版本调用 http://127.0.0.1/demo-phpclient.php 调用demo-phpserver.php发布的HelloWorld()方法 demo1 ...

    RemObjects Samples for Delphi

    通过研究 "RemObjects Samples for Delphi" 中的代码,Delphi 开发者可以深入理解如何在实际项目中运用 RemObjects 技术,提升他们的分布式应用开发能力。这些示例不仅是学习工具,也是解决特定问题的起点,可以帮助...

    php rpc远程过程调用

    PHP RPC是PHP实现的RPC框架,它简化了在分布式系统中进行跨网络通信的过程。 在Web服务中,通常使用SOAP或REST等标准协议来实现跨语言和平台的通信。然而,这些方法虽然功能强大,但它们的复杂性可能导致开发和维护...

    修改phprpc源码以支持集合类的string类型的转换

    在这个主题中,“修改phprpc源码以支持集合类的string类型的转换”涉及到对Phprpc框架的源代码进行定制化改造,以适应处理集合类中的字符串类型转换需求。在IT行业中,这样的改造通常是出于特定业务场景的需求,比如...

    Raknet for Delphi 简单封装2

    在实践中,开发者应该逐步熟悉Raknet的各种功能,如RPC(远程过程调用)、BitStream数据传输、Plugin机制等,同时结合Delphi的特性,打造出高效稳定的网络应用。通过不断迭代和优化,"Raknet for Delphi 简单封装2...

    delphi与JSP通过xml-rpc协议交换数据的例子.rar_delphi XML_delphi jsp_delphi rp

    - 在这个例子中,开发者可能使用了 `XML-RPC for Delphi` 库,该库提供了易于使用的组件如 `TXMLRPCClient` 和 `TXMLRPCServer`,它们简化了调用和响应处理。 3. **JSP与XML-RPC** - JSP(Java Server Pages)是...

    解决Delphi XML-RPC 中文乱码

    此资源不要下载,请下载最新的 最近要用XML-RPC机制实现...下载Delphi XML-RPC 后发现中文字符串会出现乱码,跟踪代码后发现XML-RPC默认的 字符编码是UTF-8,而且QT也都是用UTF-8编程,故把传输字符串改为UTF-8就行了,

    python利用phprpc进行远程调用

    在这个主题中,我们将深入探讨如何利用Phprpc在Python环境中实现远程调用。 首先,我们需要了解RPC的基本概念。RPC允许一个程序调用另一个不在同一计算机上运行的程序,仿佛它们在同一台机器上并且直接通信一样。这...

    Json-RPC for java中文手册

    `json-rpc-for-java`是一个轻量级的框架,它允许使用JavaScript快速调用Java对象,并能够返回任意类型的Java对象。这一特性使得开发者能够在无需编写额外JavaScript代码的情况下,通过JavaScript调用已注册的Java...

    JSON-RPC for Java使用说明.doc

    * 微服务架构:JSON-RPC for Java 可以用于微服务架构中,提供轻量级的远程过程调用解决方案。 * 企业应用程序:JSON-RPC for Java 可以应用于企业应用程序中,提供远程过程调用解决方案。 在了解 JSON-RPC for ...

Global site tag (gtag.js) - Google Analytics