Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XmlSerializer和它';s的关联属性是否违反实体?_C#_Xmlserializer_Solid Principles - Fatal编程技术网

C# XmlSerializer和它';s的关联属性是否违反实体?

C# XmlSerializer和它';s的关联属性是否违反实体?,c#,xmlserializer,solid-principles,C#,Xmlserializer,Solid Principles,在当前的客户机上,架构师坚持使用XmlSerializer及其相关属性将对象模型序列化为XML,最终形成文件格式的基础 我坚决反对这种做法。请记住,该客户的员工不是高技能的开发人员,而承包商是专门为实施最佳实践和设计原则而引入的,因为这是一项新的实施。我一直在努力构建论点,直到我决定回到基本原则,即固体 原因1:XmlSerializer违反了单一责任原则 当我为我的对象模型(即class Person)创建模型对象时,我可以如下描述该类: Person类描述系统中人员的属性和属性 添加XmlS

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

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

原因1:XmlSerializer违反了单一责任原则

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

Person类描述系统中人员的属性和属性

添加
XmlSerializer
属性后,说明将变为:

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

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

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

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

这就是
XmlReader
甚至
LINQ-to-XML
序列化实现可以为开发人员节省大量长期维护/增强工作的地方,尽管进行了初步的开发工作,但仍然保持了接口隔离原则,因为
XmlSerializer
迫使开发人员在不使用的类接口中保留属性/属性,以便从文件格式的一个版本迁移到另一个版本

注意:我并不是说在任何地方使用
XmlSerializer
必然是糟糕的设计(尽管SRP参数对所有实现都适用),只是在接口发生变化的情况下,例如对于文件格式


严格遵守SOLID principles在不断变化的文件格式中的应用,并使用
XmlSerializer
作为序列化技术-我对SOLID principles应用的分析正确吗?

既然您喜欢阅读书籍,我可以向您推荐。这本书是关于务实而不是教条的


将属性放在类文件中以支持序列化是一种实用的方法,从这个意义上讲,其他方法,不管其感知的好处如何,实际上总体上都有更多的缺点。更难理解,更难维护,等等。

欢迎来到现实:)大型软件供应商还有很多违反良好编程原则的其他例子。我不确定你对答案的期望,因为你的问题基本上表明它违反了一些SOLID的原则。我只能说,不要把固体当作教条。如果你开始编写一个<代码> IMath <代码>接口和包装器对象,以将代码< > Stase.Mask<代码>注入到你的对象中,那么你已经走得太远了。如果你在为纯度而战,考虑使用DTO来实现序列化的目的,使模型遵循你想要的所有原则。但是,请注意,DTO违反的更多,您已经列出了…:)现实更为复杂,所有这些都是可靠的,SRP和更多。事实上,这就是为什么项目架构师存在的原因——他们负责将理论(如设计模式或原则)应用于实践。@Dirk嗯,答案可能是在这个特定的应用程序中使用
XmlSerializer
,以及为什么在这种情况下它会是好的设计?我不把SOLID视为教条,但由于过去的经验,我试图将“XmlSerializer坏”的本能反应合理化。架构师也非常重视SOLID,这就是为什么要用这些术语来表达论点。我同意实用主义,但在他的情况下,他的需求可能需要使用更复杂的方法。如果您必须支持不同版本的序列化格式,那么使用属性可能不是一个好主意。正如我所说的,
XmlSerializer
肯定有它的用途,但在文件格式发生变化的情况下,我认为它不是其中之一。另外,架构师似乎对SOLID有很高的库存,所以我用这些术语表达了论点。谢谢你的推荐书!:)下面是我如何解决不同版本问题的:a)在包含序列化类的名称空间的名称后面附加一个版本号。i、 e.我的模式1。b) 应用程序的版本1发布后(因此在字段中创建了版本1文件),请在存储库中锁定名称空间的文件夹,以便任何人都无法提交该文件夹。c) 将旧名称空间复制到新名称空间中,并递增数字。任何新的工作现在都在新的名称空间上完成。