Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.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# 如何将XML数据转换为二进制可交付文件?_C#_Xml - Fatal编程技术网

C# 如何将XML数据转换为二进制可交付文件?

C# 如何将XML数据转换为二进制可交付文件?,c#,xml,C#,Xml,我们有一个需要在启动时加载大量配置数据的应用程序。数据存储在一个XML文件中,该文件当前为40MB,但将增长到100MB或更多。此数据将在开发过程中更改,但不会在发布之间更改 我们正在寻找一种加速固定数据集加载过程的方法,一个想法导致了这个问题: 将xml文件转换为可作为二进制文件交付的内容的最简单/最有效的方法是什么 例如,我们可以在一个静态类的初始化方法中生成一个包含大量“newObjectFromXMLParam1,param2,…,paramn”行的静态类,或者我们可以使用一个包含数据的

我们有一个需要在启动时加载大量配置数据的应用程序。数据存储在一个XML文件中,该文件当前为40MB,但将增长到100MB或更多。此数据将在开发过程中更改,但不会在发布之间更改

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

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


例如,我们可以在一个静态类的初始化方法中生成一个包含大量“newObjectFromXMLParam1,param2,…,paramn”行的静态类,或者我们可以使用一个包含数据的巨大数组的对象。所有这些都可以不费吹灰之力地完成,但我怀疑有更优雅的解决方案来解决我们的问题。如果您有任何意见,我们将不胜感激。

您是否想过使用一个XML文件来代替您自己的自传XML文件?这正是他们所要做的。

我最终使用zlib创建了一个二进制格式的XML和XSD文件的压缩副本。

如果你想将XML转换成某种对象结构,你可以从两个方面中选择一个。首先,如果您主要使用XML中的节点(如),则可以为XML创建XSD,然后使用XSD.exe工具生成代码以对其进行序列化/反序列化。第二种选择是设置与XML格式匹配的简单POCO对象,只需使用XmlSerializer将XML转换为对象。

可以在同一类定义上同时兼容二进制Google的高效协议缓冲区格式和XML*

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

否则,您可以添加其他属性,并完成作业;只需调用Serializer.Serialize

:更小、更快的序列化

*=作为证明,codegen实际上就是这样工作的:将.proto DSL编译为二进制protoc,将二进制文件加载到对象模型protobuf net中,以xml XmlSerializer的形式编写,通过xslt获得C


另一种方法可能是通过xslt将xml运行到C中并编译它,但是。。。丑陋的我自己在绝对需要的时候做过这件事;这真是太可怕了,竟然把我摔碎了

我的第一个回答是:为什么???一个40 MB的XML文件已经非常庞大了。为什么还要在里面存储更多的数据? 处理这么多数据的一个好方法是使用数据库。SQLServerExpress可以免费安装,运行速度更快。如果您不想要一个完整的服务器,那么可以选择SQL server的Compact版,因为它基本上允许XCopy部署

XML的唯一优点是它对机器和人类都是可读的。对于二进制格式,您需要一些额外的工具使其具有可读性

因为您使用的是C语言,所以我选择的是SQL Server Compact edition,它有一个SQL脚本,可以在数据库上添加大量的逻辑关系和约束。一个额外的实体框架类将使数据更容易访问,在一些XML配置文件中,您唯一需要的就是连接字符串。。。 但是,如果您一直使用这个XML文件,那么已经有人建议使用ZLIB来压缩整个文件。 由于您要在一个更大的结构中处理大量的小配置文件,因此您可以——正如建议的那样——使用ZLIB创建一个ZIP文件,其中包含所有这些小XML结构作为单独的文件。ZIP文件中的文件名将标识它们用于的类,通过从ZIP文件中读取特定的XML文件,您将提高性能,因为XML解析器只需要解析一点点。
即使您需要读取所有这些XML文件的90%,性能仍然会很好,因为您使用了大量小型XML文档,这些文档的索引更小,搜索所需的时间也更少。

我们的想法是用XML编写数据,但作为构建步骤,将XML转换为ByTestStream。例如,您可以通过将xml加载到内存中的对象中,然后将该对象的二进制序列化到文件中来实现。在生产环境中,只需执行二进制反序列化并完全跳过xml

如果您想加快加载过程,压缩XML对您没有帮助。事实上,这会对您造成伤害:您的程序将不得不先解压缩XML,然后再解析它,而不是简单地解析XML

你真的没有提供太多关于你目前正在做什么的信息。您当前是否正在将XML加载到XmlDocument或XDocument中,然后对其进行处理?如果是这样,最简单的加速方法是什么 在不改变任何其他内容的情况下增加加载是为了实现一个使用XmlReader的加载方法,它允许您同时解析和反序列化数据

您是否使用XML序列化来生成XML?如果是这样,您可以像Marc Gravell建议的那样使用协议缓冲区,也可以实现二进制序列化。这假设您不需要将XML用于任何其他用途

在程序运行之前,您真的需要反序列化所有配置数据吗?或者可以使用某种延迟加载方法吗?如果您可以进行延迟加载,那么选择一些序列化格式,让您将加载过程分解为块,在程序需要时执行这些块,可以加快程序的外观性能(如果不是实际性能的话)


我想底线是:对于一个定义为需要在启动时从XML文档中加载大量数据的问题,有几十种可能的解决方法。更精确地定义问题,您将得到更多有用的建议。

VTD-XML具有内置的索引功能,称为VTD+XML,基本思想是将XML解析为VTD,然后将VTD与XML一起保存到索引文件中。。。下次加载索引的XML文档时,不必解析它,这大大加快了解析速度。。。见下文


我本来想发这篇文章的,但我想你最终会出现:我理解正确了吗:protobuf net提供了一种更快的处理xml数据的方法,但我仍然需要进行解析,对吗?两者都没有;我假设您已经有了一个通过XmlSerializer或类似工具映射到xml的对象模型。protobuf net可以使用相同的对象模型来读/写二进制文件。因此,在发布时,您将xml加载到对象模型中,并通过protobuf net以二进制形式编写。在运行时,通过protobuf net将二进制文件加载到对象模型中。我在最近的一个项目中非常成功地使用了这个技巧,我们仍然需要解析XML。如果我们使用二进制,我希望在设计时创建对象并在运行时加载它们会快得多。如果我错了,请纠正我:您的答案提供了一种在运行时轻松加载和处理xml的方法。我们已经在这样做了。我正在寻找一种以二进制形式分发该过程结果的方法。我想我没有理解您的要求。在这种情况下,您可以使用二进制序列化程序而不是Xml序列化程序将其重新序列化,然后使用二进制序列化程序将代码读入。我们最终会将文件分解为更小的部分,但这无助于解决解析问题。数据来自数据库:在客户站点上不可用。如果数据来自数据库,为什么不在较小的数据库类型中复制它?例如,将数据从大型数据库发送到小型SQL Compact数据库,并将Compact文件发送到客户端。SQL Compact是基于文件的,可以与XCopy部署一起使用。实际上,如果其他一切都失败了,但配置数据由“块”组成,每个块描述一个具有服务的对象,并且我们需要能够单独部署每个块,那么这就是我的回退策略。因此,我们需要为每个可以单独部署的对象提供一个理想的二进制文件。我应该一开始就这么说吗因此,基本上您处理的不是一个XML文件,而是一个包含许多较小XML文件的XML库:您可以更早地提到这一点,因为这意味着您可以将这些小XML文件分别存储在某个二进制压缩文件中。这样,使用二进制智能查找并读取正确的XML,然后读取小XML,这将加快解析速度…:-谢谢你的回答,尽管我对我们的问题描述得相当简洁。这里有一些非常有用的提示,我们将对此进行研究。这是如何回答这个问题的?你的问题有多愚蠢?你上五年级了吗?这是完全相关的。。。它是关于XML文档的预处理。。。