Добрый день мои коллеги-разработчики,Android gson AbstractAdapter.serialize не называется (полиморфный сериализации)
я борюсь с gson экспромты из Google в своем Android приложение. Я пытаюсь сериализовать список объектов в строку Json, однако без везения. Моя иерархия наследования выглядит так:
interface IFloorPlanPrimitive
abstract class FloorPlanPrimitiveBase implements IFloorPlanPrimitive
class Wall extends FloorPlanPrimitiveBase
class Mark extends FloorPlanPrimitiveBase
Довольно просто. В каждом классе есть несколько полей. Я искал этот вопрос в Интернете и добавил этот класс адаптера для упрощения сериализации/десериализации. В настоящее время я не могу сериализоваться, поэтому давайте сосредоточимся на этом.
public class FloorPlanPrimitiveAdapter implements
JsonSerializer<FloorPlanPrimitiveBase>, JsonDeserializer<FloorPlanPrimitiveBase> {
@Override
public JsonElement serialize(FloorPlanPrimitiveBase 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 FloorPlanPrimitiveBase 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 {
final String packageName = IFloorPlanPrimitive.class.getPackage().getName();
return context.deserialize(element, Class.forName(packageName + '.' + type));
} catch (ClassNotFoundException cnfe) {
throw new JsonParseException("Unknown element type: " + type, cnfe);
}
}
}
И это, как я использую его:
public String getFloorPlanAsJSon() {
GsonBuilder gsonBilder = new GsonBuilder();
gsonBilder.registerTypeAdapter(FloorPlanPrimitiveBase.class, new FloorPlanPrimitiveAdapter());
Gson gson = gsonBilder.create();
List<IFloorPlanPrimitive> floorPlan = mRenderer.getFloorPlan();
String jsonString = gson.toJson(floorPlan);
return jsonString;
}
От простой отладки я вижу, что serialize
метод FloorPlanPrimitiveAdapter
не вызывается при сериализации и, таким образом, я не получаю эти «типа» и "свойства" в Json. Вместо этого я получаю прямолинейную строку Json. Я полагаю, это связано с несоответствием типов. Я прошу сериализовать IFloorPlanPrimitive
, но вместо этого передаю FloorPlanPrimitiveBase
, который реализует этот интерфейс. Я ожидал, что он должен работать :)
Может ли кто-нибудь указать, как бороться с сериализацией и десериализацией в этой ситуации? Как преодолеть это «несоответствие»?
Спасибо заранее,
С уважением, Грег.