我使用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[]数据,那么它就可以正常工作)**而不更改实际类型?
1条答案
按热度按时间ukxgm1gy1#
那么有什么方法可以避免类型转换呢
不,至少不是用你当前的代码。Gson将Java数组序列化为JSON数组。在反序列化时,Gson只知道字段类型是
Object
,并识别出JSON数据包含由JSON数字组成的JSON数组。在这种情况下,它将数据反序列化为List<Double>
(或更具体地说,ArrayList<Double>
)。最干净的解决方案可能是为
RequesterArgument
添加一个类型参数,表示data
的类型:主要的区别是,当你现在使用
Gson.fromJson
时,你必须提供一个TypeToken
,它指定了T
的实际参数(另请参阅用户指南):(Note:较早的Gson版本要求您调用
typeToken.getType()
)如果这种解决方案对您来说不可行,另一种选择是向字段添加
@JsonAdapter
注解,它引用自定义TypeAdapterFactory
,其适配器会查看JSON数据,然后根据类型尝试将其反序列化为byte[]
。另外,Gson不要求你的类实现
Serializable
。为了避免任何误解,Gson不使用getter和setter,它直接修改字段值。当然,你可以让自己的代码调用getter和setter。