我正在尝试将以下对象保存到文件中以供以后使用:
public class Templates implements Serializable {
private List<ReportTemplate> sources;
private List<ReportTemplate> destinations;
public List<ReportTemplate> getSources() {
return sources;
}
public void setSources(List<ReportTemplate> sources) {
this.sources = sources;
}
public List<ReportTemplate> getDestinations() {
return destinations;
}
public void setDestinations(List<ReportTemplate> destinations) {
this.destinations = destinations;
}
}
但是,ReportTemplate
类包含 SimpleStringProperty
和 SimpleObjectProperty
字段。 SimpleObjectProperty
包含一个自定义对象,该对象还包含 Property
字段。
我的所有类都实现了Serializable
,但显然,属性字段没有实现,导致在尝试序列化Templates
时出现许多错误。
我可以在这里采取哪些解决方法?我还考虑过使用 JAXB
API 保存为 XML,但遇到了类似的问题。
我花了大约一个小时阅读有关序列化不可序列化对象的各种问题,但它们都只深入一层;例如,他们谈论序列化不可序列化的String
,但不是也具有不可序列化字段的自定义对象。
如果除了序列化或 XML 之外还有更好的方法来保存这样的对象,我绝对愿意接受建议;我只需要能够写入/读取这个对象。
编辑:
根据 Vinoth 的回答,我尝试了 Gson,结果好坏参半。在简单测试中序列化 Templates
对象时一切正常,但在我的应用程序中使用它时,在写入对象后尝试再次加载该对象时出现以下异常:
java.lang.RuntimeException: Unable to invoke no-args constructor for com.sun.javafx.binding.ExpressionHelper<java.lang.String>. Registering an InstanceCreator with Gson for this type may fix this problem.
java.lang.UnsupportedOperationException: Abstract class can't be instantiated! Class name: com.sun.javafx.binding.ExpressionHelper
由于某种原因,输出 Json 添加了“helper”和“observable”键,仅在实际应用程序中添加,而不是在测试中添加。
Templates
对象包含 ReportTemplate
对象的 ArrayLists
,但没有任何可观察到的内容。
测试中的对象和我的应用程序是相同的,所以我不知道为什么它会变得困惑。
最佳答案
使用 Gson ( https://github.com/google/gson ) toJson() 和 fromJson() 方法将 Java 对象转换为 JSON 字符串。您可以将 json 字符串保存到 xml
序列化:
Gson gson=new Gson();
String templateJson=gson.toJson(templateObj);
反序列化:
String templateJson="{.....}"
Templates template = gson.fromJson(templateJson, Templates.class);
关于Java - 如何将复杂对象(不可序列化)保存到文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48800157/