【问题标题】:EMF NotSerializableExceptionEMF NotSerializableException
【发布时间】:2016-11-17 17:10:54
【问题描述】:

我使用 EMF 在 Java 中构建应用程序。
我使用 Java8 JDK。
我所需要的只是持久化我的模型类的实例。
我从 Eclipse 远程在 WildFly 10 服务器上以调试模式运行代码。

private String getXml(Audit audit) throws NeoflexException {
    XMLResource res = new XMLResourceImpl();        
    res.getContents().add(audit);       
    StringWriter sw = new StringWriter();

    try {
        res.save(sw, null);
    } catch (IOException e) {
        throw new NeoflexException(e);
    }

    return sw.toString();   
}

在序列化时,我得到一个NotSerializableException
我看到生成的审计类没有标记为Serializable
我无法编辑生成的代码,但是,我也没有选项将图表中的此类标记为可序列化。
如此处所述:https://www.eclipse.org/forums/index.php/t/261475/
我需要创建一个接口并从可序列化中派生它,但我没有这样的选项。请参阅随附的屏幕截图。

【问题讨论】:

    标签: eclipse emf


    【解决方案1】:

    一般来说,EMF 可串行化并不绑定到 ISerializable 接口,而是模型元素之间形成的包含层次结构。此外,您根本不应该让 EMF 接口扩展 ISerializable 接口,因为它具有误导性(EMF 模型对象不应该使用基本的 Java 序列化进行序列化)。

    基本上,您的类的实例应该是包含树:一个对象应该是树的根,所有其他实例都应该包含在其中。然后,您可以通过将模型根添加到资源中来将整个包含层次结构保存到文件中。

    在不知道异常中的具体错误消息的情况下,我的第一个技巧是检查 Audit 元素是否引用了其他模型元素,因为如果在非包含关系中引用了该元素,则序列化将失败。

    要设置关系包含,请编辑您的元模型(Audit.ecore 文件)并将名为 containment 的属性设置为 true 以供参考。但是,您必须确保可以正确设置包含子树:只有一个模型根元素;所有其他元素都可以通过 恰好一个 路径的 containment 引用从模型根目录到达。如果一个元素被交叉引用引用,它也必须包含在包含层次结构中,以便 EMF 序列化 (Resource.save) 起作用。

    另一个问题我看到您手动创建 EMF 资源文件,没有任何 URI(确定您要保存模型的位置)并且没有任何资源集(用于将模型拆分为多个文件/资源包含层次结构)。

    换句话说,您应该创建一个 ResourceSet 实例,并使用它来创建您的模型资源实例。

    有关更多详细信息,我建议查看 vogella.com 上的 basicserialization specific 教程。

    【讨论】:

      猜你喜欢
      • 2015-06-01
      • 2013-05-14
      • 2023-04-03
      • 2014-07-23
      • 2015-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多