2

I need to create binary data file. It cannot be created in one pass, I need to serialize some data, then go back and write offsets in the header. File will comfortably fit in memory (a few megabytes). Can I use BinaryWriter and go back to write offsets using writer.Seek(x, SeekOrigin.Begin)? Or maybe writing to file (and then modyfing it) has any advantages? Or maybe there is no real difference?

4

2 回答 2

1

您应该创建一个打包结构来表示标题,而不是偏移到文件中。填写结构并写在文件的开头。一口气阅读结构也将更容易。

于 2011-08-29T22:39:58.270 回答
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 |

长度参数编码该块的总长度,接下来你拥有每个块的任何属性,然后是被序列化的实际对象的原始字节。

于 2011-08-30T06:14:14.603 回答