我需要创建二进制数据文件。它不能在一次传递中创建,我需要序列化一些数据,然后返回并在标题中写入偏移量。文件将舒适地适合内存(几兆字节)。我可以用BinaryWriter
然后用writer.Seek(x, SeekOrigin.Begin)
写偏移量吗?或者写文件(然后修改它)有什么好处?或者也许没有真正的区别?
您应该创建一个封装结构来表示标题,而不是在文件中偏移。填充结构并将其写入文件的开头。它也将更容易阅读结构一次。
所以你想在你的文件前面留一些空间,写二进制数据块,同时记录每个块的大小,然后返回并写header来指示每个块的开始和结束位置。
你问的解决方案似乎是合理的,但我相信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参数对该块的总长度进行编码,然后是每个块的任何属性,然后是被序列化的实际对象的原始字节。