在我的web method
中,我得到了一些第三方C#实体类的对象。实体类不过是DataContract
。这个实体类非常复杂,具有各种类型的属性,某些属性也是集合。当然,那些链接类型也是DataContracts。
作为Web服务的业务逻辑的一部分,我想将该DataContract实体序列化为XML 。 我不能直接使用DataContractSerializer
(在Web方法中接收到的对象上)仅因为XML模式完全不同。 因此,不会针对该架构验证DataContractSerializer生成的XML。
我无法总结实现方法。我可以想到以下实现方法:
XmlSerializer
生成XML。在这种情况下,我将必须创建实体类,并且每当修改第三方实体时,都必须在类中添加新属性。 (具有XmlElement或XmlAttibute属性)。 但人们建议在此代码上使用DataContractSerializer
,因此除非所有方面对我都清楚,否则我不希望最终确定该代码。 IXmlSerializable
并在WriteXml
方法中生成所需的Xml。 DataContractSerializer比XmlSerializer快,但是如果第三方实体发生更改,我将不得不再次处理更改(在WriteXml中)。 问题:
DataContractSerializer
(因为它比XmlSerilaizer
具有更好的性能)? 最佳答案
我同意@Werner Strydom的回答。
我决定使用XmlSerializer
,因为代码变得可维护并且提供了我期望的性能。最重要的是,它使我可以完全控制XML结构。
这就是我解决问题的方式:
我根据需要创建了实体类(代表各种类型的Xml元素),并通过XmlSerializer传递了根类的实例(代表根元素的类)。
在1:M关系中少量使用LINQ
:
在特定节点(例如Employee
)下多次需要同一个元素(例如Department
)的地方,我都声明了List<T>
类型的属性。例如public List<Employee> Employees
类中的Department
。在这种情况下,XmlSerializer显然在Employees
节点下添加了一个称为Employee
的元素(它是所有Department
元素的分组)。在这种情况下,我使用LINQ
(在XmlSerializer序列化.NET对象之后)来操纵XmlSerializer生成的XElement
(即XML)。使用LINQ
,我只需将所有Employee
节点直接放在Department
节点下,然后删除Employees
节点。
但是,结合使用xmlSerializer
和LINQ
可以获得预期的性能。
缺点是,当我创建的所有类很可能是内部的时,它们都必须是公共(public)的!
为什么不使用DataContractSerializer
和LINQ-to-XML
?
DataContractSerializer
不允许使用Xml属性(除非我实现IXmlSerializable
)。参见types supported by DataContractSerializer。 LINQ-to-XML
(还有IXmlSerializable
)在创建复杂的XML结构时会使代码变得笨拙,并且该代码肯定会使其他开发人员在维护/更改它时费尽心思。 还有其他方法吗?
XSD.exe
或诸如Xsd2Code之类的工具很好地生成类,如果对生成的类满意,可以直接与它们一起工作。 关于serialization - Linq到Xml VS XmlSerializer VS DataContractSerializer,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11151231/