我需要创建二进制数据文件。它不能一次创建,我需要序列化一些数据,然后返回并在标题中写入偏移量。文件将舒适地适合内存(几兆字节)。我可以使用BinaryWriter
并使用writer.Seek(x, SeekOrigin.Begin)
返回写入偏移量吗?或者写文件(然后编写它)有什么优势?或者也许没有真正的区别?
答案 0 :(得分:1)
您应该创建一个用于表示标题的压缩结构,而不是偏移到文件中。填写结构并将其写在文件的开头。一次性阅读结构也会更容易。
答案 1 :(得分:0)
我想我理解你的问题。你正在从程序的其他部分序列化对象,并且在你要求序列化之前你不知道每个块的大小...并且你不想一次序列化所有这些,因为这可能是一个很多记忆。
因此,您希望在文件前面留出一些空间,以块的形式写入二进制数据,同时记录每个块的大小,然后返回并写入标题以指示每个块的开始和停止位置。
你问的解决方案似乎是合理的,但是我相信如果你回到标题位置,BinaryWriter会覆盖,所以你需要在前面写一个空字节填充以留下自己写入标题的空间 - http://msdn.microsoft.com/en-us/library/system.io.binarywriter.seek.aspx#Y640
现在问题是,你的标题有多大?你写了多少个空字节?可能取决于您必须序列化的对象数量。听起来现在你遇到了和以前一样的问题。
相反,我会按顺序打包您的数据,例如:
| --------- Chunk 1 ----------|--------- Chunk 2 -----------|
| length | name | ... | bytes | length | name | ... | bytes |
length参数对该块的总长度进行编码,接下来你拥有每个块的任何属性,然后是所有被序列化的实际对象的原始字节。