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

标签 java gson nio

尝试序列化包含 java.nio.file.PathObject 时出现 java.lang.StackOverflowError

即使我写:

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());
    }
}

并应用它:

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

我仍然无法序列化这个类:

public class ConstructorSetup {

    private Path appIconMimmapDirPathOnPc;

}

堆栈跟踪:(完整信息 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)

有什么解决办法吗?

最佳答案

你的问题是 Path 是一个 interface。假设您使用了 Paths.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())

您可以使用的另一种方法是registerTypeHierarchyAdapter:

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

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

关于java - 如何使用 Gson 序列化 java.nio.file.Path?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36964995/

相关文章:

java - 读取新终端窗口的控制台输出

java - Android - 将对象保存到 SharedPreferences 并在应用程序中的任何位置获取它

java - 我应该有两个线程用于输入/输出还是使用 NIO?

json - 将json的日期属性反序列化为LocalDate

java - 使用 Java NIO 将文件从一个目录移动到另一个目录

java - 如何提高 MappedByteBuffer 的性能以适应我的用例?

java - BlackBerry - 如何将 URL 从一个屏幕传递到另一个屏幕

java - 如何在 Struts 1 中进行 URL 重定向?

java - 程序在 eclipse 中与库一起工作,但在提取到 jar 时不工作

java - 使用Gson将json字符串解析为对象