4

我正在使用 C#从XPDL 标准导入和导出。

我已经使用XPDL 2.1为类编写了层次结构,并使用XmlSerializer. 我需要实现XPDL 2.2

类的结构发生了变化。还有其他参数。有Artifacts哪些是根类的子类的列表,但较新的版本DataObject从所有工件中都丢失了。DataObjects 从一个额外的 List 移动到WorkflowProcess.

我需要支持XPDL 2.1XPDL 2.2。实现它们的最佳方法是什么?

我可以看到3种方式:

  1. 复制并粘贴现有层次结构并进行必要的修复(太糟糕了!)
  2. 创建一个基类并创建两个子类。一个用于 2.1,另一个用于 2.2(但维护起来会不会太复杂?)
  3. 使用enum变量实现条件序列化。该类将包含 2.1 和 2.2 的超集(此选项似乎过于复杂)

请让我知道是否有更好的方法。

4

1 回答 1

1

在您的解决方案中创建两个额外的单独项目。第一个应该包含要从 XPDL 2.1 解析的类。

第二个是 2.2,它应该包含第一个项目文件夹中的所有 cs 文件作为链接。不要手动管理它们,而是将这些行添加到您的第二个项目文件中:

<Compile Include="..\ParserXPDL21\Classes\**\*.cs">
  <Link>Classes\file.cs</Link>
</Compile>

请记住,每次从第一个项目中添加或删除文件时都要重新加载第二个项目,否则 Visual Studio 将无法编译它,直到您这样做。

对于第二个项目,在项目属性中声明一个条件常量:XDPL22

现在您可以像这样修改第一个项目文件以在同一个文件中维护两个版本:

#if !XDPL22
namespace ParserXPDL21
#else
namespace ParserXPDL22
#endif
{
    [Serializable]
    public class Root
    {
#if !XDPL22
        public Artifact[] Artifacts { get; set; }
#endif
        public int NormalProperty1 { get; set; }
        public int NormalProperty2 { get; set; }
        public int NormalProperty3 { get; set; }

    }
}

之后,您可以从主项目中引用这两个项目,并使用两个不同版本的类。

我知道这似乎是一种非常优雅的方式,但是当您必须制作大量重复的代码时它会有所帮助。

您仍然需要一种方法来检查您要阅读的 XPDL 版本。可能您可以只查看文件扩展名,但如果它与您可以尝试读取 2.2 相同,并且如果它引发异常或数据不正确认为这是 2.1,或者您可以使用 XmlReader 手动读取 XML 并检查在反序列化之前。

于 2014-09-24T21:53:56.360 回答