我正在尝试使用Gson序列化/反序列化一个非常大的对象(这就是为什么我不会在这里编写整个对象)和json。
我已将TypeAdapter创建为DateTime
和LocalDate
,但异常仍然出错:
java.lang.UnsupportedOperationException: Attempted to serialize java.lang.Class: java.lang.Integer. Forgot to register a type adapter?
但正如我在Gson docs中读到的那样,Integer不需要TypeAdapter,所以我检查了里面的所有内部对象,寻找需要适配器的东西,我找到了这些非原始类型:
设置,列表,数组,枚举
我已经找到了所有这些,似乎没有人需要TypeAdapter。
我正在使用此代码序列化对象:
Gson gson = new GsonBuilder()
//these adapters are already tested and everything went right
.registerTypeAdapter(DateTime.class, new DateTimeJsonConverter())
.registerTypeAdapter(LocalDate.class, new LocalDateJsonConverter())
.create();
WStepWork returnValue = new WStepWorkBL().getStep(id, currentUserId);
String json = gson.toJson(returnValue);
有谁知道我是否真的需要TypeAdapter用于这四种中的任何一种或可能出错的地方?
提前致谢。
编辑: 我找错了,因为这个原因引起了错误:
model.java:
@XmlAccessorType(XmlAccessType.NONE)
public class WExternalMethod implements java.io.Serializable {
//many attributes
private String[] paramlistName;
private Class[] paramlistType;
}
mapping.hbm.xml:
<class name="org.beeblos.bpm.core.model.WExternalMethod" table="w_process_head_method">
<property name="paramlistName"
type="com.sp.hibernate.common.usertype.StringArrayUserType">
<column name="paramlist_name">
<comment>for APP synchro: parameter list to send</comment>
</column>
</property>
<property name="paramlistType"
type="com.sp.hibernate.common.usertype.ClassArrayUserType">
<column name="paramlist_type">
<comment>for APP synchro: parameter list types (java types)</comment>
</column>
</property>
</class>
答案 0 :(得分:0)
这是一个被误解的人。它要求TypeAdapter到Class而不是整数,所以我做了:
public class ClassJsonConverter implements JsonSerializer<Class>, JsonDeserializer<Class> {
public ClassJsonConverter(){
super();
}
@Override
public JsonElement serialize(Class src, Type srcType, JsonSerializationContext context) {
String str = src.getName();
return new JsonPrimitive(str);
}
@Override
public Class deserialize(JsonElement json, Type type, JsonDeserializationContext context)
throws JsonParseException {
Class returnValue = null;
try {
String str = json.getAsString();
returnValue = Class.forName(str);
return returnValue;
} catch (IllegalArgumentException e) {
return null;
} catch (ClassNotFoundException e) {
String mess = "deserialize(): "
+ (e.getMessage()!=null?". "+e.getMessage():"")
+ (e.getCause()!=null?". "+e.getCause():"");
}
return returnValue;
}
}