java.lang.RuntimeException:
Failed to invoke public org.jbox2d.collision.shapes.Shape() with no args ...
Caused by: java.lang.InstantiationException ...
The Shape constructor takes a ShapeType argument - this is stored as the field m_type. In order to deserialize a Shape you need to read the m_type field out of the JSON string and instantiate the concrete class based on the ShapeType. The code to do this is given below:
package com.exposure101.ubik.shared.io.json;
import java.lang.reflect.Type;
import org.jbox2d.collision.shapes.CircleShape;
import org.jbox2d.collision.shapes.PolygonShape;
import org.jbox2d.collision.shapes.Shape;
import org.jbox2d.collision.shapes.ShapeType;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
public class ShapeTypeAdapter implements JsonDeserializer<Shape> {
@Override
public Shape deserialize(JsonElement element, Type type,
JsonDeserializationContext context) throws JsonParseException {
final JsonObject wrapper = (JsonObject) element;
final ShapeType shapeType = ShapeType.valueOf(wrapper.get("m_type").getAsString());
Type actualType = getClass(shapeType);
return context.deserialize(element, actualType);
}
private Class<? extends Shape> getClass(ShapeType shapeType) {
switch (shapeType) {
case CIRCLE:
return CircleShape.class;
case POLYGON:
return PolygonShape.class;
default:
return null;
}
}
}
No comments:
Post a Comment