2014-02-13 48 views
2

在应用程序中,我们可以保存应用程序的当前状态及其配置(可能很大)。我们正在使用XmlSerializerC#:无需反射即可将对象序列化为XML

我们现在只有我们需要的所有XML(所有XmlIgnore都适用),并且它非常缓慢地存储整个配置(文件大小约为50-100MB)。

,我们需要保持存储这个配置XML,但我们想避免:

  • 反射,这是减缓
  • 要实现IXmlSerializable接口

的想法我们可以在每个对象中实现一种方法,在该对象中我们可以注册要序列化的字段/属性,然后有一个SerializationManager,它能够读取我们想要序列化的内容,然后编写它们。像这样,对象不知道它们将被呈现的语言(XML),并且如果有一天我们想要二进制序列化(或者如果我们想要以不同格式序列化的可能性),我们能够。

但我们不希望推倒重来,我不知道,如果一些库中存在,或者类似的LINQ to XML可以提供帮助,或者这是本身可能,...

所以你觉得我能做到这一点?

+0

100 MB的任何形式的配置是一个坏主意恕我直言。你应该使用一个数据库。 – fejesjoco

回答

4

“反射,这是慢”

除了它,它不使用运行时反射。它在第一次运行时执行元编程(假设您使用new XmlSerializer(type))来检查类型并生成将在给定类型上工作的静态代码。因此,与音量有关的任何性能问题都与反思无关。有一个机会,元编程本身可以采取可测量的时间,但一个:除非你的模型是真的复杂,和b这是不可能的:它可以通过使用sgen.exe工具预先生成可避免序列化程序集。

因此,任何性能问题很可能是由于模型的大小和xml的开销。

如果您想尝试不同的序列化程序,请考虑类似protobuf-net的内容。您将无法读取数据(它不会是xml),但输出会更小更快。

0

至于你提到

在应用程序中,我们可以保存应用程序的当前状态,它的配置

国家,特别是当它是大(100兆是...巨大!),需要自己的方式来序列化数据。我们中的许多人都知道并且讨厌从过去节省的缓存/加载游戏。即使是现在,游戏开发商仍将快速保存与有序保存区别开来。它被优化为发生得更快(例如,通过缓存最近执行的快速保存的一部分)而不是顺序保存。

第一个问题是为什么XML? BinarySerializer更快,但对于像这样的尺寸,您最好使用手动序列化(正如Marc Gravell所建议的,使用protobuf,它最终胜过任何东西)。

第二个问题是,你真的需要序列化数据(改变它们的格式)?保存状态的最快方式是转储内存。想象一下,你将所有的数据保存在一块内存中,然后将这个块存入一个文件是一个非常快速的保存。你可能(我不确定,但它应该是可行的)以某种方式构建你的数据,重写这个内存将是种类加载游戏。这种转换速度要快得多。

如果你去倾销,然后考虑打包它(压缩)。打包和保存10 MB应该比保存未打包的100 MB更快(假设,你没有使用太慢或太好的打包算法),内存操作和CPU比SSD快得多。

要保存配置,您仍然可以照常序列化它。如果你希望它是一个单一的文件,然后定义该文件的自己的格式,以例如:

config_stream, separator["<<<>>>>"], memory block [100 Mb] 

序列化与XmlSerializer到内存中,创建文件,保存配置,分离器,转储。

+0

100MB巨大 - >同意,最坏的情况下,我们通常的情况是20MB。为什么XML?因为我们有一些嵌入软件的硬件需要读取配置的*部分。第二个问题的答案相同 – J4N

+0

好的,所以你必须坚持使用XML。你能改变它的格式吗?不用序列化'double [1234567]',你可以将它转换为字节数组,可能是zip,编码,然后保存为xml的单个元素。 – Sinatr

+0

我们通常没有庞大的数组。有些部分可能会更改,有些则不会(发送给硬件的人)。 – J4N