如何用Gson序列化java.nio.file.Path?

如何用Gson序列化java.nio.file.Path?,java,gson,nio,Java,Gson,Nio,当试图序列化包含java.nio.file.Path的对象时,我得到java.lang.StackOverflowerError 即使在我写的时候: public class PathConverter implements JsonDeserializer<Path>, JsonSerializer<Path> { @Override public Path deserialize(JsonElement jsonElement, Type type,

当试图序列化包含
java.nio.file.Path的
对象时,我得到
java.lang.StackOverflowerError

即使在我写的时候:

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());
    }
}
Stacktrace:(完全打开)

线程“main”java.lang.StackOverflower中出现异常 位于com.google.gson.internal.$gson$Types.resolve($gson$Types.java:380) 位于com.google.gson.internal.$gson$Types.resolve($gson$Types.java:375) 位于com.google.gson.internal.$gson$Types.resolve($gson$Types.java:380) ... 位于com.google.gson.internal.$gson$Types.resolve($gson$Types.java:380) 位于com.google.gson.internal.$gson$Types.resolve($gson$Types.java:355) 位于com.google.gson.internal.bind.ReflectTypeAdapterFactory.getBoundFields(ReflectTypeAdapterFactory.java:117) 位于com.google.gson.internal.bind.ReflectTypeAdapterFactory.create(ReflectTypeAdapterFactory.java:72) 位于com.google.gson.gson.getAdapter(gson.java:356) 位于com.google.gson.internal.bind.ReflectTypeAdapterFactory$1。(ReflectTypeAdapterFactory.java:82) 位于com.google.gson.internal.bind.ReflectTypeAdapterFactory.CreateBundfield(ReflectTypeAdapterFactory.java:81) 位于com.google.gson.internal.bind.ReflectTypeAdapterFactory.getBoundFields(ReflectTypeAdapterFactory.java:118) 位于com.google.gson.internal.bind.ReflectTypeAdapterFactory.create(ReflectTypeAdapterFactory.java:72) 位于com.google.gson.gson.getAdapter(gson.java:356) ... 位于com.google.gson.internal.bind.ReflectTypeAdapterFactory$1。(ReflectTypeAdapterFactory.java:82) 位于com.google.gson.internal.bind.ReflectTypeAdapterFactory.CreateBundfield(ReflectTypeAdapterFactory.java:81) 位于com.google.gson.internal.bind.ReflectTypeAdapterFactory.getBoundFields(ReflectTypeAdapterFactory.java:118) 位于com.google.gson.internal.bind.ReflectTypeAdapterFactory.create(ReflectTypeAdapterFactory.java:72) 位于com.google.gson.gson.getAdapter(gson.java:356)

有什么解决方案吗?

您的问题是
路径
是一个
接口
。假设您使用了
path.get(“/”
,它将在我的Windows PC上创建类似
WindowsPath
的实例。现在,您必须告诉GSON如何反序列化此类型:

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())
您可以使用的另一种方法是注册TypeHierarchyAdapter

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

typeHierarchyAdapter的目的是在您希望对一个类型的所有子类型使用相同的表示形式时涵盖这种情况,这正是您使用
Path

时的情况。请同时显示
StackOverflowerr
stacktrace。感谢您的精彩解释<代码>注册表类型层次结构适配器-我需要的。
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)
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())
.registerTypeHierarchyAdapter(Path.class, new MyPathConverter())