ECore建模生成GenModel报错:非瞬态属性需可序列化及EEList泛型问题
解决ECore模型中列表类型成员的GenModel错误与警告
我来帮你搞定这两个问题!这俩错误其实都是因为对EMF里EAttribute和集合类型的使用方式理解偏差导致的,咱们一步步来解决:
1. 先处理泛型参数警告
与'EEList'分类器关联的泛型类型应包含1个类型参数,以匹配该分类器的类型参数数量
EEList本身是EMF提供的泛型集合类,就像Java里的List<T>一样,必须指定具体的元素类型(也就是那个<T>)。你直接用EEList作为EAttribute的类型,相当于没给泛型参数,所以编辑器会抛出这个警告。
但这里要先敲个重点:EAttribute其实不应该用来绑定EEList类型——这也是第二个错误的根源,咱们后面细说。如果是正确的用法,不管是EReference还是EAttribute的多值类型,EMF都会自动帮你生成EEList实现,根本不需要你手动指定。
2. 解决“非瞬态属性必须具备可序列化数据类型”错误
属性“XYZ.Attribute_name”非瞬态,必须具备可序列化的数据类型
这个错误的核心原因:EAttribute是用来存储简单可序列化数据类型的(比如字符串、整数、布尔值,或者自定义的EDataType),而EEList是EMF的内部集合实现类,不属于可序列化的EDataType范畴。
那正确的做法分两种情况:
情况A:你要存储的是自定义EClass对象的列表
- 删除你创建的那个类型为
EEList的EAttribute - 右键你的EClass,选择New Child > EReference
- 在属性视图里,设置这个EReference的Type为你要引用的目标EClass
- 把Upper Bound的值改成
-1(表示这是一个多值引用,也就是列表) - 保存模型后,EMF会自动在生成的代码里用
EEList<你的目标类>来实现这个集合,既满足泛型要求,也不会有序列化问题
情况B:你要存储的是简单数据类型的列表(比如String、int的列表)
- 删除原来的
EEList类型EAttribute - 右键EClass,选择New Child > EAttribute
- 在属性视图里,设置Type为对应的简单数据类型(比如
EString对应Java的String,EInt对应int) - 同样把Upper Bound改成
-1 - 保存后,GenModel生成代码时会自动把这个属性处理成
EEList<String>(或对应类型的列表),完全符合序列化要求,泛型参数也会自动配置好
总结一下:EMF里的集合类型(列表)不需要你手动指定EEList,只要通过设置属性/引用的Upper Bound为-1,EMF会自动帮你处理底层的集合实现,这样就能完美避开你遇到的两个问题啦!
内容的提问来源于stack exchange,提问作者Łøćçâz Ł'âvîëstà
相关产品推荐
相关产品推荐

