c# - 如何将 XML 数据转换为二进制可交付成果?

标签 c# xml

我们有一个应用程序需要在启动时加载大量配置数据。数据存储在 XML 文件中,当前大小为 40MB,但将增长到 100MB 甚至更多。这些数据会在开发过程中发生变化,但不会在版本之间发生变化。

我们正在寻找一种方法来加速“固定”数据集的加载过程,一个想法导致了这个问题:

将 xml 文件转换为可以作为二进制文件交付的文件的最简单/最有效的方法是什么?

例如,我们可以生成一个静态类,在其初始化方法中包含大量“new objectFromXML (param1, param2, ..., paramn)”行,或者我们可以使用一个带有包含数据的巨大数组的对象。所有这些都可以轻松完成,但我怀疑对于我们的问题有更优雅的解决方案。如有任何意见,我们将不胜感激。

最佳答案

protobuf-net可以在相同的类定义上同时兼容二进制(Google 高效的“ Protocol Buffer ”格式)和 xml*。

如果您的 xml 是基于元素的并且包含诸如 [XmlElement(Order = 1)] 之类的属性,那么它甚至可以在没有任何更改的情况下工作(要工作,它需要能够找到每个属性的唯一编号,您瞧)。请注意,如果您使用继承 ([XmlInclude]),则需要添加其他属性(同样,通过类似的 [ProtoInclude] 指定一个数字)

否则,您可以添加其他属性,然后工作就完成了;只需调用 Serializer.Serialize

Result :更小、更快的序列化。

*=作为证明,这实际上是代码生成器的工作原理:将“.proto”DSL 编译为二进制文件(“protoc”),将二进制文件加载到对象模型(“protobuf-net”)中,编写为xml (XmlSerializer) ,通过 xslt 运行以获得 C#。


替代方案可能是通过 xslt 将 xml 运行到 C# 中并编译它,但是......丑陋。当绝对需要的时候我自己就这样做过;太可怕了,反射镜都被打破了! (no, really)。

关于c# - 如何将 XML 数据转换为二进制可交付成果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1887728/

相关文章:

c# - while 循环中的值未更新

c# - 以编程方式隐藏重复表

.net - XML 省略号/其他语法 - 它叫什么?

javascript - 如何清理 HTML/XML?

c# - 如何与 JavaScript 共享 C# 整数变量

c# - 在 Entity Framework \sqlite 中为实体设置状态以修改的最快方法

c# - 如何将多个选项的值从选择列表发布到 MVC Controller ?

c# - UDP 广播不适用于 Android 手机热点 C#

python - XML:从命名空间生成带有前缀的标签

java - 将 XML 数据转换为 Writeable 的高效方法