我使用C#从the XPDL standard导入和导出。
我使用XPDL 2.1为类编写了层次结构,并使用XmlSerializer
调试了序列化。我需要实施XPDL 2.2。
类的结构已经改变。还有其他参数。有Artifacts
列表是根类的子级,但较新版本从所有工件中丢失DataObject
。 DataObjects从另一个List移动到WorkflowProcess
。
我需要支持XPDL 2.1和XPDL 2.2。实现这两者的最佳方法是什么?
我可以看到 3 方式:
enum
变量实现条件序列化。该类将包含2.1和2.2的超集(此选项似乎过于复杂)如果有更好的方法,请告诉我。
答案 0 :(得分: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,或者你可以手动读取XML使用XmlReader并在反序列化之前进行检查。