当前位置: 首页 > 知识库问答 >
问题:

Eclipse EMF:定制XML反序列化,以便将旧项目加载到修改后的模型中

微生弘
2023-03-14

通过将这些项目序列化为XMI格式来保存它们。然后,这样的文件可以被加载回模型中。为此,我使用了标准的EMF工具(如Resource)。

由于模型重构,以下内容发生了变化:

  • 旧型号
    • 带有属性name(带有大写字母)的eClassmyclass
    • xmi:
      null

    如何将旧的XMI项目文件加载到我的新模型中?

    在这个问题之前,我可以:

    • 避免修改模型
    • 使模型包含新旧结构,并在加载项目文件后执行修改:将信息从旧类型移动到新类型,更新引用,...

    解决方案的约束条件是:

    • 新项目(包含 )也必须正确加载。
    • 保存(即序列化)项目模型应始终以新格式进行!

共有1个答案

养枫涟
2023-03-14

Ed Merks在EMF论坛上解决了这个问题。

通过截取XML映射来支持向后兼容性的最干净的方法是在EMF资源上启用extendedmetadata的实现。这个类是调整EMF资源及其内容的中心入口点。它避免了必须在EMF框架内专门化各种其他类。

但是,我的项目已经有一个专门的XMLHelper类,它处理XML序列化/反序列化,所以Ed Merks帮助解决了这个类中的问题。

/**
 * Helper class that allows intercepting the XML to model mapping, to support backwards compatibility.
 * <p>
 * 2 methods must be overridden to handle compatibility mappings:
 * <dl>
 * <dt>{@link XMLHelperImpl#getFeature(EClass, String, String, boolean)}</dt>
 * <dd>Is called to map features of a certain EClass. These include attributes and child elements in the XML file.</dd>
 * <dt>{@link XMLHelperImpl#getType(EFactory, String)}</dt>
 * <dd>Is called to map types that are used in the model.</dd>
 * </dl>
 * <p>
 * Their difference becomes clear by looking at the model file. Sometimes both need to be handled. For example:
 * <ul>
 * <li>a {@link Person} has zero or more {@link Person#getPhoneNumber()} configurations ('feature')</li>
 * <li>these features are of type {@link PhoneNumber} or possibly a subclass! ('type')</li>
 * </ul>
 * <p>
 * See https://www.eclipse.org/forums/index.php/m/1449615/
 */
public class CustomXmlHelper extends XMLHelperImpl implements XMLHelper {

    public CustomXmlHelper() {
        super();
        deresolve = true;
    }

    public CustomXmlHelper(XMLResource resource) {
        super(resource);
        deresolve = true;
    }

    @Override
    public EStructuralFeature getFeature(EClass eClass, String namespaceURI, String name, boolean isElement) {
        String compatName = name;
        if (eClass == ProjectModelPackage.Literals.MyClass) {
            if (!isElement && "Name".equals(name)) {
                 // 1.x to 2.x compatibility (October 2014)
                 //   1.x = MyClass attribute 'Name'
                 //   2.x = MyBaseClass attribute 'name', shared by MyClass
                 compatName = ProjectModelPackage.Literals.EMY_BASE_CLASS__NAME.getName(); // 'n(!)ame'
            }
        }
        // future feature mappings handled here
        return super.getFeature(eClass, namespaceURI, compatName, isElement);
    }

    @Override
    public EClassifier getType(EFactory eFactory, String name) {
    String compatName = name;
        if (eFactory == ProjectModelPackage.eINSTANCE) {
            // placeholder for type compatibility
            //            if ("OldTypeName".equals(name)) {
            //                compatName = ProjectModelPackage.Literals.NEW_TYPE_NAME.getName();
            //            }
        }
        return super.getType(eFactory, compatName);
    }
}
 类似资料:
  • 问题内容: 我无法找出使用杰克逊实现自定义序列化/反序列化的正确方法。我有很多类(〜50),它们带有应被序列化/反序列化而不是原始的原始字段。喜欢: 所有序列化和反序列化都非常相似,我只需要在整数之后添加一个后缀(C,页面,米等)。 一种简单的方法是在每个这样的字段中添加一对/ 注释并实现它们。但是我最终会得到100个 非常相似的 序列化器/反序列化器。 我想到了添加自定义注释的各个领域,说或,这

  • 列表项目 我从xml文件中转换并剥离了所有名称空间,并转换为Json对象,下面是我在jobject中的文件。这是我获取返回的Env对象的方法,但它返回了null。 你能帮忙指出我的模型中缺少了什么吗?我一直在做不同的路线都没有成功:( 这是我的班级: 公共类 SearchRecords_V2 { 公共列表 public class search txrecord _ V2 {[data membe

  • 我用的是Django 2。十、 我有一个用于验证请求的序列化程序。(不是ModelSerializer) 是对模型的引用。 我希望用户在字段中传递数据库id,但在验证后,got被转换为对象。 我试图重写方法,并将对象分配给字段,但它给出了错误

  • 我在我的Android应用程序中使用了外部API。问题是在响应中,我不知道如何反序列化返回对象列表。我得到的JSON有这样的格式: 改装中的API调用如下所示: 我想忽略属性,并从该响应中检索。我知道我可以创建一个自定义的反序列化器,像这里这样忽略JSON中的一些字段,并像这里这样将成员转换为数组,但是在第二个链接中,我需要一个包装器类来形成我所期望的我的。有没有可能在我的列表/数组周围没有包装器

  • 我在尝试“反序列化”对象时遇到以下错误: 我需要能够使用这个XStream库序列化/反序列化对象,甚至是那些没有参数构造函数的对象。

  • 问题内容: 当谈到Dart中的JSON编码时,根据Seth Ladd的赞誉 ,现在最终批准的正式方式是+ 。 假设我们有一堆模型类(PODO),例如: 现在,我希望能够像这样对我的域对象进行JSON编码: 不幸的是,这行不通… …除非我们明确告知如何编码: 我真的必须在模型类的每个类中添加一个方法,还是有更好的方法? 编辑 :这是我正在寻找的简单序列化: 例如,在ServiceStack.Text