Guten Tag meine Kolleginnen und Entwickler genannt,Android Gson AbstractAdapter.serialize nicht (polymorphe Serialisierung)
Ich bin mit Gson lib von Google in meinem Android-App zu kämpfen. Ich versuche, eine Liste von Objekten zu JSON-String zu serialisieren, jedoch ohne Glück. Meine Vererbungshierarchie sieht so aus:
interface IFloorPlanPrimitive
abstract class FloorPlanPrimitiveBase implements IFloorPlanPrimitive
class Wall extends FloorPlanPrimitiveBase
class Mark extends FloorPlanPrimitiveBase
Ziemlich einfach. Es gibt einige Felder in jeder Klasse. Ich suchte im Internet nach dieser Angelegenheit und fügte diese Adapterklasse hinzu, um das Serialisieren/Deserialisieren zu erleichtern. Derzeit kann ich nicht serialisieren, also konzentrieren wir uns darauf.
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);
}
}
}
Und das ist, wie ich es verwenden:
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;
}
Von einem einfachen Debug ich sehe, dass serialize
Methode der FloorPlanPrimitiveAdapter
nicht aufgerufen werden, wenn die Serialisierung und damit komme ich nicht jene „type“ und "Eigenschaften" Felder in Json. Stattdessen bekomme ich eine direkte Json-Saite. Ich nehme an, das liegt an den unterschiedlichen Typen. Ich möchte IFloorPlanPrimitive
serialisieren, aber übergeben Sie FloorPlanPrimitiveBase
, die diese Schnittstelle implementiert. Meine Erwartung war, dass es funktionieren sollte :)
Kann jemand darauf hinweisen, wie man in dieser Situation mit Serialisierung und Deserialisierung umgehen? Wie man dieses "Missverhältnis" überwinden kann?
Vielen Dank im Voraus,
Mit freundlichen Grüßen, Greg.