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 写程序就会方便多了。

你可能感兴趣的:(工作,Delphi,phprpc)