Java Gson byte[] array转换为ArrayList

xqkwcwgp  于 2023-04-04  发布在  Java
关注(0)|答案(1)|浏览(293)

我使用Gson进行对象序列化和反序列化,但是Gson将byte[]数组转换为ArrayList
对象类

public class RequesterArgument implements Serializable {

 private Object data;
 
     public void setData(Object data) {
        this.data = data;
    }

    public Object getData() {
        return data;
    }
    
}

我有一个对象数组[]

byte[] data = {74,97,118,97,73,110,85,115,101};

现在我把这个byte[]设置到我的对象

byte[] data = {74,97,118,97,73,110,85,115,101};
    
    RequesterArgument request = new RequesterArgument();
    request.setData(data);

System.out.println(request.getData().getClass().getName());

现在输出为**[B**byte
但如果我把它转换成JSON字符串

String jsonString = new Gson().toJson(request);

并再次尝试将其转换为Actual对象

RequesterArgument response = new Gson().fromJson(jsonString, RequesterArgument.class);

System.out.println(response.getData().getClass().getName());

如果我尝试打印类名,它会给我java.util.ArrayList类型
那么,有没有什么方法可以避免类型转换**(如果我将Object数据更改为byte[]数据,那么它就可以正常工作)**而不更改实际类型?

ukxgm1gy

ukxgm1gy1#

那么有什么方法可以避免类型转换呢
不,至少不是用你当前的代码。Gson将Java数组序列化为JSON数组。在反序列化时,Gson只知道字段类型是Object,并识别出JSON数据包含由JSON数字组成的JSON数组。在这种情况下,它将数据反序列化为List<Double>(或更具体地说,ArrayList<Double>)。
最干净的解决方案可能是为RequesterArgument添加一个类型参数,表示data的类型:

public class RequesterArgument<T> {
    private T data;

    ...
}

主要的区别是,当你现在使用Gson.fromJson时,你必须提供一个TypeToken,它指定了T的实际参数(另请参阅用户指南):

TypeToken<RequesterArgument<byte[]>> typeToken = new TypeToken<RequesterArgument<byte[]>>() {};

RequesterArgument<byte[]> response = new Gson().fromJson(jsonString, typeToken);

(Note:较早的Gson版本要求您调用typeToken.getType()
如果这种解决方案对您来说不可行,另一种选择是向字段添加@JsonAdapter注解,它引用自定义TypeAdapterFactory,其适配器会查看JSON数据,然后根据类型尝试将其反序列化为byte[]
另外,Gson不要求你的类实现Serializable。为了避免任何误解,Gson不使用getter和setter,它直接修改字段值。当然,你可以让自己的代码调用getter和setter。

相关问题