GSON et InstanceCreator problème

J'ai le texte suivant Pojo:

public interface Shape {
    public double calcArea();
    public double calcPerimeter();
}

public class Rectangle implement Shape {
    //Various properties of a rectangle
}

public class Circle implements Shape {
    //Various properties of a circle
}

public class ShapeHolder {
    private List<Shape> shapes;

    //other stuff
}

Je n'ai pas de problème à se GSON pour sérialiser une instance de ShapeHolder en JSON. Mais quand j'essaie de désérialiser une Chaîne de JSON de retour dans une ShapeHolder exemple, j'ai des erreurs:

String shapeHolderAsStr = getString();
ShapeHolder holder = gson.fromJson(shapeHodlderAsStr, ShapeHolder.class);

Jette:

Exception in thread "main" java.lang.RuntimeException: Unable to invoke no-args constructor for interface    
net.myapp.Shape. Register an InstanceCreator with Gson for this type may fix this problem.
    at com.google.gson.internal.ConstructorConstructor$8.construct(ConstructorConstructor.java:167)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:162)
    ... rest of stack trace ommitted for brevity

Alors, j'ai cherché ici et commencé à mettre en place mon propre ShapeInstanceCreator:

public class ShapeInstanceCreator implements InstanceCreator<Shape> {
    @Override
    public Shape createInstance(Type type) {
        //TODO: ???
        return null;
    }
}

Mais maintenant je suis coincé: je suis seulement un java.lang.reflect.Type, mais j'ai vraiment besoin d'un java.lang.Object afin que je puisse écrire un code comme:

public class ShapeInstanceCreator implements InstanceCreator<Shape> {
    @Override
    public Shape createInstance(Type type) {
        Object obj = convertTypeToObject(type);

        if(obj instanceof Rectangle) {
            Rectangle r = (Rectangle)obj;
            return r;
        } else {
            Circle c = (Circle)obj;
            return c;
        }

        return null;
    }
}

Que puis-je faire? Merci à l'avance!

Mise à JOUR:

Par @raffian de la suggestion (le lien qu'il/elle a posté), j'ai mis en place un InterfaceAdapter exactement comme celui dans le lien (je n'ai pas changé rien). Maintenant, je suis l'exception suivante:

Exception in thread "main" com.google.gson.JsonParseException: no 'type' member found in what was expected to be an interface wrapper
    at net.myapp.InterfaceAdapter.get(InterfaceAdapter.java:39)
    at net.myapp.InterfaceAdapter.deserialize(InterfaceAdapter.java:23)

Des idées?

Vérifiez ceci: stackoverflow.com/a/19600090/1360888, il a une classe de base au lieu d'une interface, mais c'est comme votre problème.

OriginalL'auteur IAmYourFaja | 2013-12-07