编码解码
概述
HTTP
调用绝大部分情况是面向REST API
的场景,并且请求和响应的有效载荷都是JSON
文本,编码解码器Codec
就是为了这个场景特化设计。
内置实现
Solpic
提供了一些常用的JSON
框架对Codec
接口的实现,见下表:
编码 | 实现类 | JSON 框架 |
---|---|---|
none | NoneCodec | 无,空实现,也是默认实现 |
jackson | JacksonCodec | Jackson |
gson | GsonCodec | Gson |
fastjson | FastJsonCodec | Fastjson |
fastjson2 | FastJson2Codec | Fastjson2 |
Solpic
在加载Codec
实例会自适应优选合适的实现,要支持某种实现必须手动把对应JSON
框架的依赖添加到项目中。如果存在多个JSON
框架依赖,那么会选取优先级最高的一个实现进行加载,优先级如下:
shell
jackson(1) -> fastjson2(2) -> fastjson(3) -> gson(4) -> none(5)
例如想要启用JacksonCodec
,那么项目中需要引入jackson
依赖:
xml
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson-databind.version}</version>
</dependency>
WARNING
JSON
序列化和反序列化是很复杂的功能,Solpic
没有实现此类功能,因此当项目中没有引入上述四种JSON
框架之一,默认加载的实现就是NoneCodec
(序列化和反序列化都只会返回NULL
)
接着加载它:
java
Codec codec1 = Solpic.loadCodec();
Codec codec2 = Solpic.loadCodec("jackson");
// 支持泛型参数加载
private static <S, T> Codec<S, T> cutomLoadCodec() {
return Solpic.loadCodec();
}
自定义实现
可以自行实现Codec
接口。例如:
java
class CustomCodec<S, T> implements Codec<S, T> {
@Override
public byte[] toByteArray(S s) {
return new byte[0];
}
@Override
public T fromByteArray(byte[] bytes, Type type) {
return null;
}
@Override
public int write(OutputStream outputStream, S s) throws IOException {
return 0;
}
@Override
public T read(InputStream inputStream, Type type) throws IOException {
return null;
}
}
在当前类路径下添加META-INF/solpic/cn.vlts.solpic.core.codec.Codec
文件,内容如下:
properties
custom=xx.yy.zz.CustomCodec
使用自定义Codec
:
java
private static <S, T> Codec<S, T> loadCodec() {
return Solpic.loadCodec("custom");
}
Codec<RequestObject, ResponseObject> codec = loadCodec();