- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的 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/
尝试返回一个时出现以下错误向客户提出问卷调查对象。我按照建议在数据协定中添加了 KnowType[typeof(...)],但它仍然不起作用。不知道序列化程序不知道哪种类型,我只是放入了 EF 模型中
我们有一个带有对象的应用程序,我们希望该对象在数据库中保持序列化。 当前,我们正在使用NetDataContractSerializer,但是最近发现,由于涉及到.Net类型信息,它创建了巨大的文件,
我正在阅读微软的 Best Practices: Data Contract Versioning ,他们说: Do not remove data members in later versions
我正在编写一个将由 Silverlight 应用程序使用的 WCF 应用程序。我已经完成了大部分的设计工作,我现在正在做实现,这让我想出了这个问题。 这是我的应用程序中存在的内容的示例: [DataC
我正在使用 DataContractSerializer 来存储我自己的类的对象以保存用户设置。 UserSettings 类使用其他一些不同数据类型的对象。我将所有这些类型添加到 DataContr
当我有以下类并尝试使用 DataContractSerializer 序列化 ConcreteClass 实例时.WriteObject(..) 我收到一个 InvalidDataContractEx
我有 50 个标有 DataContractAttribute 的类。 这些类形成了一个巨大的层次树,使用DataContractSerializer将其序列化/反序列化为xml。 除了我遗漏的 3
以下程序尝试从层次结构中序列化然后反序列化通用类型的对象,失败并出现代码下方列出的错误。 如何让它发挥作用? 代码: [DataContract] [KnownType(nameof(GetKnown
我遇到了一个关于数据协定序列化程序的非常愚蠢的问题。它拒绝工作。我只是想将一个对象序列化为一个 XmlDocument,但我似乎碰壁了。 以下是我希望序列化的数据契约(Contract): [Data
我在代码中序列化一个对象(不是通过 WCF 调用),并且我对已知类型有点着迷(我已经将它们与 WCF 一起使用,但没有将 DataContract 序列化程序作为“独立”序列化器) 当我运行下面的代码
我想使用 DataContractSerializer,但我对 WriteObject 方法中的 Stream 参数感到困惑 - 我知道我可以使用 MemoryStream 或 XmlWriter。我
这里有一些说明问题的测试代码: 编译配置: 公共(public)语言运行时支持:/clr C++ 语言 错误信息: 错误 4 错误 C2065:“DataContractSerializer”:未声明
我在反序列化 xml 文件中的列表时遇到问题。我的属性是内部的,所以我使用的是 datacontractserializer 而不是 xmlserializer。 我的xml如下
我注意到,如果我使用 Datacontractserializer 将对象持久化回文件中,如果新 xml 的长度比文件中最初存在的 xml 短,则原始 xml 的剩余部分会超过新 xml 的长度将保留
我正在使用 DataContractSerializer 将 xml 反序列化为列表。 xml结构如下: Attributes 类有 3 个通过属性引用的字符串数据成员,它们是: [Da
我正在从以 XML 形式返回 XML 的 restful 服务中提取数据 param1 value param2 value param1 value
我正在使用 HttpClient 将 xml 发布到休息服务。问题是服务需要命名空间前缀,而我无法使用 DataContractSerializer 实现。 预期的 xml:
我使用 DataContract 序列化程序来序列化我的数据。我使用 PreserveObjectReferences = true 因为我需要它。例如,我有两个对象: [Datacontract]
当使用 DataContractSerializer 反序列化 XML 时,我遇到了基类序列的问题。没有派生类从 XML 中反序列化:
最近,当我阅读 DataContractSerializer 的默认行为时,我得到了 rules来自 MSDN,但是我不明白我提取的第一条规则如下: The DataContractSerialize
我是一名优秀的程序员,十分优秀!