关于C/S中传输数据的反序列化

关于JAVA的泛型擦除

Java的泛型是只在编译时有效,但是在运行时泛型已经被擦除了。比如说,List List在编译后就看成是一个类的实例 List。当然在发送消息时只发送基本类型的数据,就不会出问题。但是当发送一个类类型或者一个Map亦或者一个List这样接收到的消息将不能反解析为有用的消息。所以泛型擦除在这里带来很大的麻烦。

关于gson的TypeToken

为了解决这个问题,我们找到谷歌公司开发的一个jar包 --gson jar包。在这个jar包中有一个TypeToken包。其使用方式如下。这里使用的是Map<String,String>。也就是所说的带有泛型的数据。
关于C/S中传输数据的反序列化

要知道为什么能够解决首先要明白两个问题。
1.为什么带有{}?
在java中这样的写法当然是一个匿名内部类的写法,而这就是关键,他是TypeToken的子类。
2.为什么他是子类就能获取泛型的类型?
这是一个很巧妙的地方,类似List这样的泛型是会被擦除,那么我们就先用一个子类来继承他,父类的类型是确定的,那么子类的类型肯定是确定的了,jvm是会保存这部分信息,那么就完成了“不被擦除”。对于获取时,java是有提供API出来的:对于带有泛型的class,返回一个ParameterrizedType对象,对于Object、接口和原始类就返回一个null,碎玉数组calss则是返回Object.class。而parameterrizedType就是表示带有泛型参数的类型的java类型

传输数据的封装工具

关于C/S中传输数据的反序列化
关于C/S中传输数据的反序列化
对于上述的代码说明一下。通过TypeToken记录每一个ArgumentMaker类对象的Map类型。在每一次反序列化是将map还原
。Gson对象的创建自然不用多讲,其次就是对Map中取数据时方法。只是将方法重载了一下,这里也是有值得注意的地方,这里也是为了处理泛型,如果只有Class<?>将只能处理简单类型,对于泛型处理必须使用Type。