2009-10-25 147 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得到一些有趣的结果。一般来说很容易适应现有的类,并且通常要小得多,速度快而且不易碎(可以更改对象模型而不废弃数据)。

披露:我是作者,所以可能会有偏差 - 但它确实不是很糟糕......尽管如此,我乐意借给你一些时间来帮助你尝试。

* =原因