datasnap的进阶 传递自定义类型的类
前面我写了一个返回自定义类的例子,将要返回的类marshal后装进TJSONArray,今天看来真是多余,因为datasnap的对自定义类的marshal做得很自动,直接返回就行。
前面我定义了
然后写了服务方法 这样写没问题,如果直接写成 是不可以的,因为TPersonArray不是类,它的TTypeInfo的TypeKind不是tkClass而是tkDynArray,目前是不datasnap支持的。 于是可以写一个集合类
然后写服务方法 这样就可以了,服务器端可以直接写,客户端可以直接读,不用自己去marshal和unmarshal了。 那是不是说,我们的Field只要封到类里就一定ok呢,不是的。 将上面的类修改为如下 TDateTime其实是一个double类型,在datasnap里面是被支持的,TStringList却不行了。但是如果客户端是其他语言REST来的,TDataTime在客户端就难被解释了。怎么办呢 其实Datasnap里,我们可以自己定义marshal的规则。 XE2里面,有两个类TConverterEvent给编码,和TReverterEvent来解码。给EMBT封装后,用法也很简单。
将上面的TPerson修改为
给Birthday增加描述,JSONReflect是个描述类,继承自TCustomAttribute。 看JSONReflect的代码
顾名思义, 第一个参数是表示进去的数据类型, 第二个是出来的类型, 第三个是执行转换的类,必须从TJSONInterceptor继承 第四个先不管,必须从TJSONPopulationCustomizer继承 第五个表示了是否拥有创建出来的类 目前只管写第3个执行转换的类。由于我们只是要转字符串,所以只覆盖字符的转换就行。
怎么转换,和上面的一样的了。我是觉得这个方法比上面的法子好。 |
|