の原因シリアライズ、にStackOverflowErrorが発生します。Gsonは:java.nio.Pathはこれをシリアル化にStackOverflowError
import java.nio.file.Path;
import java.nio.file.Paths;
public class Tmp{
private Path path=null;
public Tmp() {
path=Paths.get("c:\\temp\\");
}
}
それは私にはバグのように見えます!または私は何か間違っている? は(Stringにパスを変換し、いくつかのカスタム・シリアライザを書く期待)
java.lang.StackOverflowError
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:372)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376)
...
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:128)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:75)
at com.google.gson.Gson.getAdapter(Gson.java:358)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getFieldAdapter(ReflectiveTypeAdapterFactory.java:109)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.access$100(ReflectiveTypeAdapterFactory.java:46)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:84)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:83)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:129)
...
シリアル化する方法がある回避策はあり:
public static void saveTo(BatchLogging logging, Path path) throws IOException {
Gson gson=new GsonBuilder().setPrettyPrinting().create();
// String json = gson.toJson(logging);
String json = gson.toJson(new Tmp());
List<String> lines = Arrays.asList(json.split(System.lineSeparator()));
Files.write(path, lines, StandardCharsets.UTF_8);
}
http://stackoverflow.com/q/36964995/1032167詳細カスタムクラス 'PathConverterがJsonDeserializer、JsonSerializer 'を実装し、 '.registerTypeHierarchyAdapter(Path.class、new MyPathConverter()) 'として登録してください。 –
varren