【问题标题】:Java - How do I save a complex object (non-Serializable) to a file?Java - 如何将复杂对象(不可序列化)保存到文件中?
【发布时间】:2018-02-15 04:54:35
【问题描述】:

我正在尝试将以下对象保存到文件中以供以后使用:

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 类包含 SimpleStringPropertySimpleObjectProperty 字段。 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 对象包含 ArrayListsReportTemplate 对象,但没有什么是可观察的。

测试中的对象和我的应用程序是相同的,所以我不知道为什么会混淆。

【问题讨论】:

    标签: java serialization jaxb


    【解决方案1】:

    使用 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);
    

    【讨论】:

    • 自从看到您的回答后,我一直在尝试使用 Gson,但只取得了很小的成功。 toJson()fromJson() 在简单的测试中工作正常,但在我的实际应用中,toJson() 在输出中添加了“helper”和“observable”键。这会在尝试再次加载文件时导致异常,因为它正在尝试实例化“com.sun.javafx.binding.ExpressionHelper”,这是一个抽象类。
    • @Zephyr,你有没有找到解决方案?我几乎在同一条船上。
    • @A.J. - 不,我没有;现在最终使用了一种完全不同的方法。
    猜你喜欢
    • 2019-02-10
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多