【问题标题】:Does XmlSerializer and it's associated attributes violate SOLID?XmlSerializer 及其相关属性是否违反 SOLID?
【发布时间】:2015-02-09 19:18:32
【问题描述】:

在当前的客户中,架构师坚持使用XmlSerializer 及其相关属性将对象模型序列化为 XML,这最终将形成文件格式的基础。

我坚决反对这种方法。请记住,该客户的员工不是高技能的开发人员,并且承包商是专门为实施最佳实践和设计原则而引入的,因为它是一个全新的实施。我一直在努力构建论点,直到我决定回到基本原则,即 SOLID。

原因一:XmlSerializer 违反了单一职责原则

当我为我的对象模型(即类 Person)创建模型对象时,我可以如下描述该类:

Person 类描述系统中 Person 的属性和属性。

添加XmlSerializer 属性后,描述变为:

Person 类描述系统中 Person 的属性和属性 这些属性和属性如何序列化为 XML。

注意。因此,违反了单一职责原则

原因 2:从长远来看,XmlSerializer 会导致类违反接口隔离原则

由于这是一种文件格式,随着时间的推移,可以保证的一件事是文件格式会发生变化和迁移 - XmlSerializer 非常顽固,因为它使用一种 XML 模式(基于它的属性)并且这就对了。添加像ObsoleteAnnotation 这样的属性虽然它不会阻止普通开发人员使用该特定属性,但确实会阻止XmlSerializer 将值序列化到/从该属性(基本上就像事实上的XmlIgnoreAttribute!)。

这是XmlReader 甚至LINQ-to-XML 序列化实现将在长期维护/增强方面为开发人员节省大量精力的地方,尽管最初的开发工作很努力并保持接口隔离原则 因为XmlSerializer 强制开发人员将属性/属性保留在他们不使用的类接口中,以便从一种文件格式版本迁移到另一种版本。

注意:我并不是说在任何地方都使用XmlSerializer一定是糟糕的设计(尽管 SRP 论点适用于所有实现),仅在接口发生变化的情况下,即文件格式。

严格遵守SOLID原则应用于变化的文件格式并使用XmlSerializer作为序列化技术——我对SOLID原则应用的分析是否正确?

【问题讨论】:

  • 欢迎来到现实 :) 大型软件供应商还有很多其他违反良好编程原则的例子。
  • 我不确定您对答案的期望,因为您在问题中基本上表明它确实违反了 SOLID 的某些原则。我只能说不要把 SOLID 当作教条来对待。如果您开始编写 IMath 接口和包装对象以将 System.Math 注入到您的对象中,那么您已经走得太远了。
  • 如果您正在为纯度而战,请考虑使用 DTO 进行序列化,以使模型遵循您想要的所有原则。但是,请注意,DTO 违反的甚至更多,你已经列出了...... :) 现实更复杂,所有这些 SOLID、SRP 等等。事实上,这就是项目架构师存在的原因——他们负责将理论(如设计模式或原则)应用于实践。
  • @Dirk 好吧,答案可能是在这个特定应用程序中使用XmlSerializer 的论据,为什么在这种情况下它会是好的设计?我不将 SOLID 视为教条,但由于过去的经验,我试图合理化“XmlSerializer bad”的直觉反应。架构师还高度重视 SOLID,这就是为什么以这些术语表达论点的原因。

标签: c# xmlserializer solid-principles


【解决方案1】:

既然你喜欢看书,我可以向你推荐The Pragmatic Programmer。这本书是关于务实而不是教条

将属性放在类文件中以支持序列化是一种实用方法,从某种意义上说,其他方法,无论其感知到的好处如何,实际上总体上往往具有更多的缺点。更难理解、更难维护等等。

【讨论】:

  • 我同意实用主义,但在他的情况下,他的要求可能证明使用更复杂的方法是合理的。如果您必须支持不同版本的序列化格式,那么使用属性可能不是一个好主意。
  • 我认为这更多是为了合理化我对“XmlSerializer bad”的直觉反应。正如我所说的XmlSerializer 肯定有它的用途,但在文件格式不断变化的情况下,我认为它不是其中之一。此外,建筑师似乎对 SOLID 有很高的评价,所以我已经用这些术语表达了这些论点。并感谢您的书籍​​推荐! :)
  • 这是我将如何解决不同版本问题的方法: a) 将版本号附加到包含序列化类的命名空间的名称。即 MyModel1。 b) 一旦应用程序的版本 1 发布,(因此版本 1 文件已在该字段中创建)锁定存储库中命名空间的文件夹,以便没有人可以提交它。 c) 将旧命名空间复制到新命名空间并增加编号。任何新工作现在都在新命名空间上完成。
猜你喜欢
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
  • 2016-12-29
  • 2013-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多