Java Gson byte[]数组被转换为ArrayList



我使用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]字节

但如果转换成JSON字符串

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

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

RequesterArgument response = new Gson().fromJson(jsonString, RequesterArgument.class);
System.out.println(response.getData().getClass().getName());

如果我尝试打印类名而不是它会给我java。util。arraylist类型

那么有没有办法在不改变实际类型的情况下避免类型转换呢?注意:(如果我将对象数据更改为字节[]数据,则它工作正常)

那么有没有办法避免类型转换

不,至少对你当前的代码来说不是这样。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);

(注意:较旧的Gson版本要求调用typeToken.getType())

如果该解决方案对您来说不可能,另一个选项是向字段添加@JsonAdapter注释,该注释引用自定义TypeAdapterFactory,其适配器窥视JSON数据,然后根据类型尝试将其反序列化为byte[]

另外,作为旁注,Gson不要求您的类实现Serializable。为了避免误解,Gson不使用getter和setter,它直接修改字段值。当然,你可以让自己的代码调用getter和setter。

相关内容

  • 没有找到相关文章

最新更新