因为ServiceObject的函数签名格式是统一的,可以传递的参数只有一个AParams:OLEVariant,客户端的多个参数需要使用数组传递。如:
但是这种方式不太直观,AParams内部的元素严重依赖顺序,一旦写好,很难改变。另一种方式是使用序列化的Object,如:
使用某种编码方式,把这个元件序列化成一个stream,这样就很容易传递到服务器,服务器的ServiceObject再把stream反序列化TMarshalSumParams。
序列化在delphi中,有两种方式可以利用:
1、使用TWriter和TReader。这两个元件,是delphi用来读写其dfm文件的,你在剪切/黏贴元件时,也是它们在工作。但是两个元件只写元件published属性,也没有专门考虑来做客户端服务器的序列化,所以任何published不支持的数据类型,它都不处理,如动态数组,Variant也只支持byte数组。这里需要修改。TWriter写出的是二进制流,效率比文本高。
2、使用SOAP对TRemotable元件的编码方式,编码成XML格式。同样它对Variant只支持byte数组,如果你要支持别的variant类型,需要自己改造。需要说明的是,XML编码效率比较低,数据量越大越明显。
在Delphi2010的时候,支持了Json格式的序列化,它应该是比XML更高效的一种方式。
一旦序列化成stream,我们就可以使用任何压缩方式在传递前压缩,如zlib,leo,等。