2009-10-25 85 views
6

使用BinaryFormatter進行序列化/反序列化,生成的序列化文件的大小約爲80MB。反序列化需要幾分鐘的時間。我該如何改進?這裏的反序列化代碼:如何提高反序列化速度?

public static Universe DeserializeFromFile(string filepath) 
    { 
     Universe universe = null; 

     FileStream fs = new FileStream(filepath, FileMode.Open); 

     BinaryFormatter bf = new BinaryFormatter(); 
     try 
     { 
      universe = (Universe)bf.Deserialize(fs); 
     } 
     catch (SerializationException e) 
     { 
      Console.WriteLine("Failed to deserialize. Reason: " + e.Message); 
      throw; 
     } 
     finally 
     { 
      fs.Close(); 
     } 

     return universe; 
    } 

也許閱讀所有內存之前反序列化或使用一些其他的序列化技術?

回答

0

嘗試一次將文件讀入內存流,然後使用內存流進行反序列化。

+3

內如果讓事情變得更好,而不是更壞,那麼序列化格式很爛。爲什麼I/O綁定任務*後跟* CPU綁定任務,當你可以同時執行交叉操作? – hobbs 2009-10-25 12:05:39

2

嘗試UnsafeDeserialize。據說可以提高速度。

+0

UnsafeDeserialize 460138 ms,Deserialize 459967 ms ..即。反序列化實際上更快!我將UnsafeDeserialize的標題設置爲null,這可能是原因嗎? – Carlsberg 2009-10-25 14:00:02

-1

在宇宙類中的可實現ISerializable

0

數據有多複雜?如果它是一個對象(而不是一個完整的),那麼你可能會從嘗試protobuf-net得到一些有趣的結果。一般來說很容易適應現有的類,並且通常要小得多,速度快而且不易碎(可以更改對象模型而不廢棄數據)。

披露:我是作者,所以可能會有偏差 - 但它確實不是很糟糕......儘管如此,我樂意借給你一些時間來幫助你嘗試。

* =原因