2014-02-13 53 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