我使用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。