Eclipse EMF - 有没有一种方法可以在不同的 Eclipse 插件中引用模型的一部分 class 而不必存储 tostring()?

Eclipse EMF - Is there a way to reference a class that is part of a model in a different eclipse plugin without having to store the tostring()?

eclipse 插件模型中的一个 class 需要在完全不同的模型和插件中引用另一个 class。

为此,我发现了这个 thread,它建议使用 edatatype 并使用我需要 link 的类型初始化其实例 class。但是,当我尝试在不同的模型中 link 到我的 class 时,它会保存 class 的 tostring,如下例

<tasks description="" id="p1.tsk4" label="1" type="place" time="10">
  <requiredCapabilityDescriptor>cod.gen.impl.CapabilityDescriptorImpl@78483404 (description: , id: cap2, label: ) (parent: null)</requiredCapabilityDescriptor>
  <involvedResource>cod.gen.impl.ResourceDescriptorImpl@2839ac4c (description: null, id: null, label: null) (cad: null, material: null, pointySurface: &lt;unset>, sharpEdges: &lt;unset>, thumbnail: null, weight: &lt;unset>) (changeCost: null, generic: &lt;unset>, investCost: null, manufacturer: null)</involvedResource>
</tasks>

在这个例子中,我 link 连接到两个不同的外部 classes CapabilityDescriptorImpl 和 ResourceDescriptorImpl。如您所见,存储的 tostring 在存储和可读性方面不方便,而且我不太确定这种情况下的一致性处理(我的意思是删除、编辑引用的实例)。根据线程,写入 tostring 是因为我选择了可​​序列化的数据类型,我尝试使其不可序列化,但那没有用。

所以我尝试了另一种使用 eReference 的方法,该方法将要保存的字符串最小化为

<tasks description="" id="p1.tsk4" label="1" type="place" time="10">
 <requiredCapabilityDescriptor xsi:type="CoD:CapabilityDescriptor" description="" id="cap2" label=""/>
  <involvedResource xsi:type="CoD:ResourceDescriptor"/>
</tasks>

这在可读性和存储方面要好得多,但我真的怀疑它是一个实际的引用,它不包含任何可以引用原始实例的东西。实际上我确定它不是指原始对象,因为它没有显示任何 econtainer。再次出现一致性问题。

我能想到的最后一个选择是存储引用对象的 URI,但在这种情况下,我将不得不自己处理所有一致性问题。

所以我的问题是"is there a better way to achieve this external class referencing?"

灵感来自 Generating an Extended EMF Model。我做了以下事情:

  1. 首先,我将所有单独的模型文件放入其中一个模型文件的包中。
  2. 导出 genmodel 以分隔每个包的 xsds。
  3. 确保每个 xsd 文件中的导入标签指向导入模型的 xsd 的有效 URL。
  4. 在我的插件中分发 xsd 文件。
  5. 在每个插件中创建 genmodel 时,我只是引用了导入模型的 genmodel(必须以相同的导入顺序生成 genmodel,一个不导入任何模型,然后仅依赖于它等等)
  6. 现在在不同型号中正常使用引用指向类。

这创建了一个类似于

的 xmI 文件
 <c xmlns:c="platform:/resource/my_project/Resource/c.xsd">
  <c:res C:id="r" C:label="r">
    <C:des>My.des#//@rDes.0</C:des>
  </C:resources>
</C:c>

指向另一个名为 My.des

的 XMI 文件