BinaryFormatter替代品

Don*_*eba 13 .net binaryformatter

BinaryFormatter序列化的128³双倍阵列,占用50 MB的空间.序列化128个结构的数组有两个字段需要150 MB,处理时间超过20秒.

是否有快速简单的替代品可以生成压缩文件?我的期望是上面的例子分别占用16和32 MB,并且在两秒钟内处理.我看了一下protobuf-net,但看起来它甚至不支持struct数组.

PS:我为记录文件大小时出错而道歉.BinaryFormatter的实际空间开销并不大.

Hen*_*man 7

如果您使用BinaryWriter而不是Serializer,您将获得所需的(mimimal)大小.
我不确定速度,但试一试.

在我的系统上写32MB需要不到0.5秒,包括打开和关闭流.

您必须编写自己的for循环来写入数据,如下所示:

struct Pair
{
    public double X, Y;
}

static void WritePairs(string filename, Pair[] data)
{
    using (var fs = System.IO.File.Create(filename))
    using (var bw = new System.IO.BinaryWriter(fs))
    {
        for (int i = 0; i < data.Length; i++)
        {
            bw.Write(data[i].X);
            bw.Write(data[i].Y);
        }
    }
}

static void ReadPairs(string fileName, Pair[] data)
{
    using (var fs = System.IO.File.OpenRead(fileName))
    using (var br = new System.IO.BinaryReader(fs))
    {
        for (int i = 0; i < data.Length; i++)
        {
            data[i].X = br.ReadDouble();
            data[i].Y = br.ReadDouble();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 手动序列化确实非常快速和紧凑,但它也容易出错并且编写时间很长.我希望有一些开销,但使用BinaryFormatter通常是不合理的. (2认同)

Guf*_*ffa 5

序列化意味着添加元数据,以便可以安全地反序列化数据,这就是造成开销的原因。如果您自己序列化数据而不使用任何元数据,则最终会得到 16 MB 的数据:

foreach (double d in array) {
   byte[] bin = BitConverter.GetBytes(d);
   stream.Write(bin, 0, bin.Length);
}
Run Code Online (Sandbox Code Playgroud)

这当然意味着您还必须自己反序列化数据:

using (BinaryReader reader = new BinaryReader(stream)) {
   for (int i = 0; i < array.Length; i++) {
      byte[] data = reader.ReadBytes(8);
      array[i] = BitConverter.ToDouble(data, 0);
   }
}
Run Code Online (Sandbox Code Playgroud)