2013-12-21 114 views
1

好的,我們實現了/ seserializing的東西,但是當你使用人的重要數據時,你需要確保對象是100%正確的序列化/反序列化。例如,讓我們來看一下當你的應用程序在序列化過程中被強行關閉的情況下..在大多數情況下,你會得到損壞的對象,這是不能接受我,我不能手動做文件備份和寫標誌,在開始序列化之前lke uncommited並在進程結束時添加標誌提交,並且如果在反序列化期間未被取消,則從備份取得文件。這是不好的,因爲我必須在每次更改後備份非常大的文件。在.NET Framework或protobuf中流行的序列化器中是否有一些構建失敗的安全邏輯?我無法找到任何信息abaut faile安全序列化。 或者你可以告訴我一些很好的模式如何使序列化安全嗎?失敗安全序列化

+2

不。如果「非常大的文件」是你的問題,那麼你顯然需要移動到數據庫。其中支持交易。 –

+0

國際海事組織你可以雕刻序列化出這個問題:首先序列化 - 現在你有數據:如何以故障安全的方式原子地變異數據?這是一個衆所周知的問題,像RDBMS人們知道的很多。 –

+0

@HansPassant是的,交易。不幸的是 這是一個很大的舊應用程序,由於內部原因它們不會切換到數據庫,因此存在性能問題。串行器對於原始數據要快得多 –

回答

2

序列化與此無關。你的實際問題是:我如何將一堆數據原子地寫入磁盤?這裏有幾個選項:

  1. 如果數據足夠小,以適應單個磁盤簇(512個字節或4K)使用FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING以原子寫在每一個寫調用一個單一的磁盤扇區。
  2. 使用事務性NTFS自動寫入任意數量的數據。
  3. 寫入.tmp文件並自動重命名爲所需的文件名
  4. 使用一些其他的手段來實現,如數據庫原子性(甚至SqlLite,ESENT,...)或Windows的CLFS。