Excel>bytes导表方案
为什么对于Excel表格要用紧密二进制不用json对于重复相同结构的列表、字典字段名会重复很多次多占用大量空间特别是字段名较长时。如果不是相同数据结构大量重复比如键值对配置就适合json。以及次要原因{}、、[]、:这些符号占用空间。Excel导bytes还有两种转换路线字符串具体类型byte[]一种是单元格字符串转换成C#对象int、float、bool、int[]、string[]、Vector3再把对象转换成byte[]BinaryWriter提供了把很多基本类型写入字节流的方法但是没有各种数组、Vector3、字典转换byte[]的方法要自己定义自己写字符串数据类型byte[]。运行时解析时把byte[]解析成各种对象解析byte[]对象还要自己写。有一些框架是用扩展方法给数组写转换、解析。字符串byte[]另一种是简单粗暴的把Excel单元格字符串用BinaryWriter写入byte[]运行时读取时还原字符串从字符串对象。这个转换要手写。要注意的是表格里的空单元格在bytes里要占位避免把一个字符串解析成错误的列。这里看BinaryWriter.Write()写入空字符串是只写入一个长度头。using(MemoryStream ms new MemoryStream()) using(BinaryWriter writer new BinaryWriter(ms)) { writer.Write(string.Empty); Debug.Log(ms.ToArray().Length); Debug.Log(BitConverter.ToString(ms.ToArray())); }这个方案要注意即使是int、bool、float这些基本类型也是写入了字符串解析时必须先读回字符串再Parse解析。那么这样又比直接写基本类型麻烦。并且不能整个文件就一堆字符串byte[]必须有办法分辨一行以及一共几行。分辨这些就是两种方案要么加长度头要么加结束符。那么在文件头加一个行数告诉循环读取多少次。每一行加\n的话那个是给字符串分割很方便BinaryReader识别\n反而不方便。每一行开头记录列数也没必要因为每一列是要填入对象字段的不用循环写结果就是不需要加任何行分割符就靠固定次数的读取字符串保证正确。混合方案那么我们发现对于int、float、boolBinaryWriter有转换方法直接转换byte[]、解析更简单对于List、Dictionary直接字符串转byte[]解析时转回字符串再解析手写代码更少不用再写字符串List、Listbyte[]、byte[]List。那么我们能不能把二者结合起来int、float、bool直接写其他用字符串。这样需要转换时判断类型行是不是int、float、bool但又没有必要每行判断一次每列的类型是固定的。如果不追求性能可以就每行判断一次。如果非要避免每行判断就要用多态给int、float、bool、string做Converter开始转换前遍历类型行得到一个Converter[]。关于BinaryWriter.Write(字符串)默认是UTF8编码在前面写一个字节记录内容的字节数。单纯UTF8编码、BinaryWriter.Write写入的内容对比顺序匹配二进制的缺点删字段、换字段顺序解析代码要跟着改EndOfStreamException: Unable to read beyond the end of the stream读到第一行最后一列遇到这个。FormatException: Too many bytes in what should have been a 7 bit encoded Int32.