首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EMF NotSerializableException

EMF NotSerializableException
EN

Stack Overflow用户
提问于 2016-11-14 10:02:43
回答 1查看 111关注 0票数 1

我使用EMF在Java中构建应用程序。

我使用Java8 JDK。

我所需要的只是我的模型类的持久实例。

我在WildFly 10服务器上远程从Eclipse调试模式运行代码。

代码语言:javascript
复制
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/

我需要创建一个接口并从可串行化派生出来,但我没有这样的选择。见附上的截图。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-14 10:20:37

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

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

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

若要设置关系包含,请编辑元模型(Audit.ecore文件),并为引用设置名为true的属性。但是,您必须确保容器子树的设置是正确的:只有一个模型根元素;所有其他元素都可以由从模型根访问包容引用的一个路径。如果一个元素被交叉引用引用,那么它也必须包含在包含层次结构中,这样EMF序列化(Resource.save)才能工作。

我还看到了另一个问题,您手动创建EMF资源文件,没有任何URI (这决定了您想要保存模型的位置),也没有任何资源集(用于将模型分割为具有不同的包含层次结构的多个文件/资源)。

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

有关更多细节,我建议查看基础知识序列化专用教程在vogella.com。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40586057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档