Gson要求Integer TypeAdapter

时间:2017-07-27 11:06:01

标签: java json types gson

我正在尝试使用Gson序列化/反序列化一个非常大的对象(这就是为什么我不会在这里编写整个对象)和json。 我已将TypeAdapter创建为DateTimeLocalDate,但异常仍然出错:

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>

1 个答案:

答案 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;
    }
}