我有一个我需要二进制序列化的类.该类包含一个字段,如下所示:
private T[,] m_data;
这些多维数组可以相当大(数十万个元素)和任何原始类型.当我在一个对象上尝试标准的.net序列化时,写入磁盘的文件很大,我认为.net存储了很多关于元素类型的重复数据,可能没有那么高效.
我一直在寻找自定义序列化器,但还没有看到任何处理多维通用数组.我已经在内存流的字节数组上尝试了内置的.net压缩,序列化后取得了一些成功,但没有像我希望的那样快速/压缩.
我的问题是,我应该尝试编写一个自定义序列化程序,以便为适当的类型最佳地序列化这个数组(这看起来有点令人生畏),还是应该使用标准的.net序列化并添加压缩?
关于最佳方法的任何建议都是最受欢迎的,或链接到显示如何处理多维通用阵列的序列化的资源 - 正如我所发现的现有示例所提到的不支持这样的结构.
这就是我想出来的.下面的代码生成一个int [1000] [10000]并使用BinaryFormatter将其写入2个文件 - 一个压缩,一个不压缩.
压缩文件是1.19 MB(1,255,339字节)解压缩是38.2 MB(40,150,034字节)
int width = 1000; int height = 10000; Listlist = new List (); for (int i = 0; i < height; i++) { list.Add(Enumerable.Range(0, width).ToArray()); } int[][] bazillionInts = list.ToArray(); using (FileStream fsZ = new FileStream("c:\\temp_zipped.txt", FileMode.Create)) using (FileStream fs = new FileStream("c:\\temp_notZipped.txt", FileMode.Create)) using (GZipStream gz = new GZipStream(fsZ, CompressionMode.Compress)) { BinaryFormatter f = new BinaryFormatter(); f.Serialize(gz, bazillionInts); f.Serialize(fs, bazillionInts); }
我想不出更好/更简单的方法来做到这一点.拉链版非常紧凑.
我会选择BinaryFormatter + GZipStream.制作定制的东西根本不会很有趣.
[由MG编辑]我希望你不会被编辑冒犯,但是统一的重复范围(0,宽度)正在大大扭曲事物; 改成:
int width = 1000; int height = 10000; Random rand = new Random(123456); int[,] bazillionInts = new int[width, height]; for(int i = 0 ; i < width;i++) for (int j = 0; j < height; j++) { bazillionInts[i, j] = rand.Next(50000); }
试试吧; 你会看到temp_notZipped.txt
40MB,temp_zipped.txt
62MB.不太吸引人......