我有一个Android应用。我使用以下结构在SharedPreferences
中存储一些数据:
Hashtable<Integer, Hashtable<Size, Time>>
我通过以下方式进行序列化:
private static String serialize(Hashtable<Integer, Hashtable<Size, Time>> results) {
Gson gson = new GsonBuilder().create();
return gson.toJson(results);
}
和反序列化:
private Hashtable<Integer, Hashtable<Size, Time>> deserialize(String resultsJsonStr) {
if (resultsJsonStr == null)
return new Hashtable<>();
else {
Type typeOfHashMap = new TypeToken<Hashtable<Integer, Hashtable<Size, Time>>>() {}.getType();
return new Gson().fromJson(resultsJsonStr, typeOfHashMap);
}
}
但是,当我尝试反序列化时,会收到异常:
com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:预期为BEGIN_OBJECT,但位于第1行第8列的路径$
我的序列化字符串如下所示: {“ 3”:{“ 4x4”:“ 01:12:37 AM”}}
答案 0 :(得分:0)
问题是Time
对象不可序列化,因此您应该为其提供序列化和反序列化机制。我假设您的代码中的Time
类是java.sql.Time
,它是java.util.Date
的子类,因此它同时具有:
public long getTime() { ... }
和
public void setTime(long time) { ... }
我已经为此开发了一个示例代码,您可以根据需要进行更改:
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.sql.Time;
import java.util.Hashtable;
public class SerializeHelper {
private static Gson gson;
static {
JsonSerializer<Time> serializer = new JsonSerializer<Time>() {
@Override
public JsonElement serialize(Time src, Type type, JsonSerializationContext context) {
return src == null ? null : new JsonPrimitive(src.getTime());
}
};
JsonDeserializer<Time> deserializer = new JsonDeserializer<Time>() {
@Override
public Time deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException {
return json == null ? null : new Time(json.getAsLong());
}
};
gson = new GsonBuilder()
.registerTypeAdapter(Time.class, serializer)
.registerTypeAdapter(Time.class, deserializer).create();
}
public static String serialize(Hashtable<Integer, Hashtable<Size, Time>> results) {
return gson.toJson(results);
}
public Hashtable<Integer, Hashtable<Size, Time>> deserialize(String resultsJsonStr) {
if (resultsJsonStr == null)
return new Hashtable<>();
else {
Type typeOfHashMap = new TypeToken<Hashtable<Integer, Hashtable<Size, Time>>>() {
}.getType();
return gson.fromJson(resultsJsonStr, typeOfHashMap);
}
}
}