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