Я понял, что не так.
- При использовании HashMap со сложным классом Key, как в приведенном выше классе Rule. вам нужно включить enableComplexMapKeySerialization () для объекта gson.
- Элемент списка Класс данных является абстрактным классом. При использовании абстрактного класса для сериализации / десериализации вам необходимо зарегистрировать свой пользовательский адаптер типа.
Здесь фрагмент кода
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Data.class, new DataJsonAdapter());
gsonBuilder.enableComplexMapKeySerialization();
gson mGson = gsonBuilder.create();
Вот реализация класса DataJsonAdaptor
Важно установить конкретное имя класса во время сериализации и использовать его во время десериализации. Имя класса хранится в «типе»
public class DataJsonAdapter implements JsonSerializer<Data>, JsonDeserializer<Data> {
@Override
public JsonElement serialize(Data src, Type typeOfSrc, JsonSerializationContext context) {
JsonObject result = new JsonObject();
result.add("type", new JsonPrimitive(src.getClass().getSimpleName()));
result.add("properties", context.serialize(src, src.getClass()));
return result;
}
@Override
public Data deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
JsonObject jsonObject = json.getAsJsonObject();
String type = jsonObject.get("type").getAsString();
JsonElement element = jsonObject.get("properties");
try {
return context.deserialize(element,
Class.forName("com.package.name" + type));
} catch (ClassNotFoundException cnfe) {
throw new JsonParseException("Unknown element type: " + type, cnfe);
}
}
}