Skip to content

开发日志 2.0.0

pizihao edited this page Mar 21, 2023 · 1 revision

问题

2.0.0的主要目的是取出不必要的依赖。如现在使用的jackson的依赖和reflectasm的依赖,这些工具包大大简化了crow的开发流程但是也都给crow的使用带来了困难,尤其是版本冲突问题,所以crow必须找到这些能够替换这写工具的方法。 解决

一、jackson

对于jackson主要是用在了类型的匹配上,这一点在代码的注释中也有明确的说明:

/*
 * o及其泛型是否与parameterizedType兼容,
 * 1,通过API获取o被擦除的泛型类型,和传入的类型进行对比,相同则返回
 *      但是并没有找到对应的API,因为o的类型是Object,o如果存在泛型,那么也是Object,
 *      其真实类型是未知的,所以并不支持这种获取方式。
 * 2,通过序列化的方式,先通过参数指明类型进行序列化
 *      如果成功,则说明类型兼容,反之不兼容
 *      这需要 Jackson 的支持
 */

之前的实现是这样的:

  1. 存在一组对象Iterable,其元素的类型并不确定,存在一个类型对象Type,可能是参数化类型也可能是Class类型
  2. 遍历Iterable,并对其中的元素进行序列化
  3. 再将该元素反序列化为Type,如果序列化成功则表示类型匹配
  4. 如果反序列化失败则表示类型不匹配,则判断下一个元素 上文中说到的序列化和反序列化是指序列化为json。所以使用到了jackson。 为了去除对jackson的依赖,需要一种可以代替jackson的方式,要么自己实现json序列化,要么通过其他的方式。 先来看一下有没有其他的方式:

使用传统的序列化方式

通过传统的流来进行序列化,将对象转化为流对象或者byte数组,在以目标类型反序列化,如果成功序列化那么自然就是匹配的。 这样做是有很大的弊端的,首先就是待序列化的对象必须是实现了Serializable接口的,而对象内部的属性对象也必须是实现了Serializable接口的,否则是无法进行序列化的 到目前为止,只能是自己实现json的序列化了。

自己实现json序列化方式

这里自己实现json序列化,不需要有太复杂的功能,甚至不需要知道序列化后是什么样的,只需要知道一个未知类型的对象经过序列化后生成了一个json串,然后通过目标类型可以正确的反序列化回来即可。 这里借用jackson的实现方式,自己实现一次json工具类。 先来思考一下json数组的格式和实现,先来看一个简单的例子: { "str": "Str", "integer": 1527, "list": [ "qwe", "wer" ], "map": { "fga": 21, "fg5": 11, "fgg": 1 } } 以上基本就是json的所有格式了,任何一个对象类型都是以 { 开头以 } 结尾,数组格式是以 [ 开头以 ] 结尾,属性名是用""表示,属性名和属性值通过:分割,不同的属性通过,区分。 现在我们总结一下json的表示中一共有这么几种特殊符号: {}[],:" 通过这些符号来拼接具体的json格式。

二,reflectasm

使用java自身的反射进行替换