Проблема в том, что объекты 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);
}
}
}