C# 实现2个类似类的更好方法

C# 实现2个类似类的更好方法,c#,xml,serialization,C#,Xml,Serialization,我正在使用C#导入和导出 我使用XmlSerializer为类编写了层次结构,并调试了序列化。我需要实施 班级结构发生了变化。还有其他参数。有一个工件列表,它是根类的子类,但是较新的版本从所有工件中丢失了DataObject。数据对象从附加列表移动到WorkflowProcess 我需要支持和支持。实现这两个目标的最佳方式是什么 我可以看到三种方法: 复制并粘贴现有层次结构和所需的修复(这太糟糕了!) 创建基类并创建两个子类。一个用于2.1,另一个用于2.2(但维护起来会不会太复杂?) 使用en

我正在使用C#导入和导出

我使用
XmlSerializer
为类编写了层次结构,并调试了序列化。我需要实施

班级结构发生了变化。还有其他参数。有一个
工件列表
,它是根类的子类,但是较新的版本从所有工件中丢失了
DataObject
。数据对象从附加列表移动到
WorkflowProcess

我需要支持和支持。实现这两个目标的最佳方式是什么

我可以看到三种方法:

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

  • 请告诉我是否有更好的方法。

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

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

    <Compile Include="..\ParserXPDL21\Classes\**\*.cs">
      <Link>Classes\file.cs</Link>
    </Compile>
    
    之后,您可以从主项目中引用这两个项目,并将这些类用于两个不同的版本

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


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

    这并不是真正的“答案”,但就我个人而言,我认为第一个选项是最有用的“显然是正确的”,尽管这是更多的工作。第二个不太可能是工作,因为
    XmlSerializer
    具有继承意识,并且有特定的方式来表示继承。第三个看起来过于复杂,这通常是“脆性”的同义词“。谢谢你的评论,所以你说第一种方法是最简单的,因此我应该实施它?事实上,我希望这是你最好的选择。如果只是添加/不添加一些元素/属性,那么您可以通过“条件序列化”来处理,但是:要更改结构,您要么需要实现
    IXmlSerializable
    (这非常痛苦),要么需要从不同的结构开始。再次感谢!我想我会接受你的建议我倾向于同意马克的意见。我们可以假设2.1根本不会改变,因为这就是2.2被发明的原因。2.2也不会改变。因此,将每个项目作为一个单独的项目来实施似乎是合理的。
    #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; }
    
        }
    }