Skip to content

编码解码

概述

HTTP调用绝大部分情况是面向REST API的场景,并且请求和响应的有效载荷都是JSON文本,编码解码器Codec就是为了这个场景特化设计。

内置实现

Solpic提供了一些常用的JSON框架对Codec接口的实现,见下表:

编码实现类JSON框架
noneNoneCodec无,空实现,也是默认实现
jacksonJacksonCodecJackson
gsonGsonCodecGson
fastjsonFastJsonCodecFastjson
fastjson2FastJson2CodecFastjson2

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();

贡献者

页面历史

Released under the MIT License.