2016-05-01 4 views
8

ich java.lang.StackOverflowError, wenn sie versuchen Object zu serialisiert, die java.nio.file.PathWie serialisiert man java.nio.file.Path mit Gson?

Auch enthält, wenn ich schrieb:

public class PathConverter implements JsonDeserializer<Path>, JsonSerializer<Path> { 
    @Override 
    public Path deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { 
     return Paths.get(jsonElement.getAsString()); 
    } 

    @Override 
    public JsonElement serialize(Path path, Type type, JsonSerializationContext jsonSerializationContext) { 
     return new JsonPrimitive(path.toString()); 
    } 
} 

und es gilt:

String json = new GsonBuilder() 
      .registerTypeAdapter(Path.class, new PathConverter()) 
      .create() 
      .toJson(constructorSetup, new TypeToken<ConstructorSetup>() {}.getType()); 

kann ich immer noch nicht diese Klasse serialisiert:

public class ConstructorSetup { 

    private Path appIconMimmapDirPathOnPc; 

} 

Stacktrace: (voll auf pastebin)

Exception in thread "main" java.lang.StackOverflowError 
    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 
    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 
    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 
     ... 
    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 
    at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:355) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:117) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72) 
    at com.google.gson.Gson.getAdapter(Gson.java:356) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:82) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72) 
    at com.google.gson.Gson.getAdapter(Gson.java:356) 
     ... 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:82) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72) 
    at com.google.gson.Gson.getAdapter(Gson.java:356) 

Jede Lösung?

+1

Bitte zeigen Sie auch den 'StackOverflowError' StackTrace. – RAnders00

+0

@ RAnders00 fertig. – Alexandr

Antwort

8

Ihr Problem ist, dass Path ein interface ist. Nehmen wir an, Sie haben Paths.get("/") verwendet, was eine Instanz von etwa WindowsPath auf meinem Windows-PC erzeugt. Nun haben Sie Gson zu sagen, wie diese Art deserialisieren:

ConstructorSetup setup = new ConstructorSetup(); 
setup.setAppIconMimmapDirPathOnPc(Paths.get("/")); 

// here we get actual class type of our Path object 
Class classT = setup.getAppIconMimmapDirPathOnPc().getClass(); 

Gson gson = new GsonBuilder().registerTypeAdapter(classT, new MyPathConverter()) 

Ein weiterer Ansatz, den Sie mit zu registerTypeHierarchyAdapter gehen kann:

.registerTypeHierarchyAdapter(Path.class, new MyPathConverter()) 

Der Zweck typeHierarchyAdapter ist, den Fall zu decken, wenn Sie das wollen gleiche Darstellung für alle Subtypen eines Typs, was genau bei Path der Fall ist.

+2

Danke für die tolle Erklärung! 'registerTypeHierarchyAdapter' - was ich brauche. – Alexandr

Verwandte Themen