我使用EMF在Java中构建应用程序。
我使用Java8 JDK。
我所需要的只是我的模型类的持久实例。
我在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。
我看到生成的审计类没有标记为Serializable。
我无法编辑生成的代码,无论如何,我也没有选择将这个类在图表中标记为可序列化的。
如本文所述:https://www.eclipse.org/forums/index.php/t/261475/
我需要创建一个接口并从可串行化派生出来,但我没有这样的选择。见附上的截图。

发布于 2016-11-14 10:20:37
一般来说,EMF可序列化性并不绑定到ISerializable接口,而是在模型元素之间形成了包含层次结构。此外,您不应该让EMF接口扩展ISerializable推理,因为它具有误导性(EMF模型对象不应该使用基本的Java序列化来序列化)。
基本上,类的实例应该用于包含树:一个对象应该是树的根,所有其他实例都应该包含在其中。然后,通过将模型根添加到资源中,可以将整个包容层次结构保存到文件中。
在不知道异常中的具体错误消息的情况下,我的第一个技巧是检查审计元素是否引用了其他模型元素,因为如果在非包含关系中引用该元素,则序列化将失败。
若要设置关系包含,请编辑元模型(Audit.ecore文件),并为引用设置名为true的属性。但是,您必须确保容器子树的设置是正确的:只有一个模型根元素;所有其他元素都可以由从模型根访问包容引用的一个路径。如果一个元素被交叉引用引用,那么它也必须包含在包含层次结构中,这样EMF序列化(Resource.save)才能工作。
我还看到了另一个问题,您手动创建EMF资源文件,没有任何URI (这决定了您想要保存模型的位置),也没有任何资源集(用于将模型分割为具有不同的包含层次结构的多个文件/资源)。
换句话说,您应该创建一个ResourceSet实例,并使用它来创建您的模型资源实例。
有关更多细节,我建议查看基础知识和序列化专用教程在vogella.com。
https://stackoverflow.com/questions/40586057
复制相似问题