在C#中保存字典<String,Int32> - 序列化?

Mig*_*uel 17 c# binary performance serialization

我正在编写一个C#应用程序,需要在启动时读取大约130,000(String,Int32)对到Dictionary.这些对存储在.txt文件中,因此很容易被任何人修改,这在上下文中是危险的.我想问一下是否有办法保存这个词典,以便可以合理安全地存储信息,而不会在启动时失去性能.我尝试过使用BinaryFormatter,但问题是原始程序在启动时需要125ms到250ms来读取txt中的信息并构建字典,反序列化生成的二进制文件需要2s,这本身并不太多但与原始性能相比,速度降低了8-16倍.

注意:加密很重要,但最重要的应该是从磁盘保存和读取字典的方法 - 可能来自二进制文件 - 而不必在每一行上使用Convert.ToInt32,从而提高性能.

Mar*_*ath 26

有趣的问题.我做了一些快速测试,你说得对 - BinaryFormatter出乎意料地慢:

  • 序列化130,000个词典条目:547ms
  • 反序列化130,000个字典条目:1046ms

当我使用逗号分隔值的StreamReader/StreamWriter对其进行编码时,我得到了:

  • 序列化130,000个词典条目:121ms
  • 反序列化130,000个字典条目:111ms

但后来我尝试使用BinaryWriter/BinaryReader:

  • 序列化130,000个字典条目:22ms
  • 反序列化130,000个字典条目:36ms

代码看起来像这样:

public void Serialize(Dictionary<string, int> dictionary, Stream stream)
{
    BinaryWriter writer = new BinaryWriter(stream);
    writer.Write(dictionary.Count);
    foreach (var kvp in dictionary)
    {
        writer.Write(kvp.Key);
        writer.Write(kvp.Value);
    }
    writer.Flush();
}

public Dictionary<string, int> Deserialize(Stream stream)
{
    BinaryReader reader = new BinaryReader(stream);
    int count = reader.ReadInt32();
    var dictionary = new Dictionary<string,int>(count);
    for (int n = 0; n < count; n++)
    {
        var key = reader.ReadString();
        var value = reader.ReadInt32();
        dictionary.Add(key, value);
    }
    return dictionary;                
}
Run Code Online (Sandbox Code Playgroud)

正如其他人所说,如果您担心用户篡改文件,加密而不是二进制格式化是前进的方向.