EMF NotSerializableException

EMF NotSerializableException

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

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
我看到生成的审核 class 未标记为 Serializable.
我无法编辑生成的代码,但是,我也没有选择将图表中的此 class 标记为可序列化。
如此处所述:https://www.eclipse.org/forums/index.php/t/261475/
我需要创建一个接口并从可序列化派生它,但我没有这样的选择。请参阅所附的屏幕截图。

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

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

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

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

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

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

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