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 教程。
我在 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 教程。