java - Gson 自定义 byte[] 处理程序

标签 java serialization gson

我想要 byte[].class 到 JSON 到 B64。这是通过自定义适配器完成的。

但是,当我运行 test() 代码时,它仍保留在 B64 中,并且不会返回到 byte[]。

如何解决?

public static final Gson gson = new GsonBuilder().registerTypeHierarchyAdapter(byte[].class, new ByteArrayToBase64TypeAdapter()).create();

static class ByteArrayToBase64TypeAdapter implements JsonSerializer<byte[]>, JsonDeserializer<byte[]> {

    public byte[] deserialize(JsonElement json, ProcessBuilder.Redirect.Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        return Util.fromBase64(json.getAsString());
    }

    public JsonElement serialize(byte[] src, ProcessBuilder.Redirect.Type typeOfSrc, JsonSerializationContext context) {
        return new JsonPrimitive(Util.toBase64(src));
    }

    @Override
    public JsonElement serialize(byte[] src, java.lang.reflect.Type typeOfSrc, JsonSerializationContext context) {
        return new JsonPrimitive(Util.toBase64(src));
    }

    @Override
    public byte[] deserialize(JsonElement json, java.lang.reflect.Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        return Util.fromBase64(json.getAsString());
    }
}



private static void test(){
    ArrayList test = new ArrayList();
    test.add("hello");
    test.add("world".getBytes());

    final String json = Gson.gson.toJson(test);

    System.out.println("json: " + json);

    ArrayList from = Gson.gson.fromJson(json, ArrayList.class);
    System.out.println("from: " + from);
    for(int i = 0; i < from.size(); i++){
        System.out.println("i: " + i + "\tclass: " + from.get(i).getClass() + "\tvalue: " + from.get(i));
    }
}

系统输出:

json: ["hello","d29ybGQ\u003d"]
from: [hello, d29ybGQ=]
i: 0    class: class java.lang.String   value: hello
i: 1    class: class java.lang.String   value: d29ybGQ= //this should be in byte[].class

最佳答案

它如何知道这个特定的 JSON 字符串恰好来自 byte[]?解码时需要指定,例如

final byte[] bytes = "world".getBytes();
final String json = Gson.gson.toJson(bytes);
final byte[] bytes1 = Gson.gson.fromJson(json, byte[].class);

或者有一个带有 byte[] 字段的类。

关于java - Gson 自定义 byte[] 处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43705509/

相关文章:

java - Gson 自定义序列化程序未调用

java - 将字符串日期转换为对象会产生无效的时区指示符 '0'

java - 反序列化 GSON 中对象的 JSON 集合(可能与另一个集合)

java - 将 Java 整数绑定(bind)到 JavaScriptEngine 不起作用

java - 为什么这段代码用 eclipse 编译器编译而不用 javac (maven)

使用 AOP 的 Spring MVC 项目中的 Java 反序列化问题

c# - 使用 Json.net - C# 对象的部分自定义序列化

android - 将 Realm 对象作为 Retrofit 2 PUT 请求主体传递

java - 移动到新包后,IntelliJ 将 GIT 存储库的文件标记为未跟踪

java - 分离的实体传递到持久化 : model. 公司