设计强大的文件格式编写器的指南?
Guidelines for designing a robust file format writer?
假设你想像这样编写一个 .WAV 文件格式的编写器:
using var stream = File.OpenRead("test.wav");
using var writer = new WavWriter(stream, ... /* .WAV format parameters */);
// write the file
// writer.Dispose() does a few things:
// - writes user-added chunks
// - updates the file header (chunk size) so the file is valid
这样做有一个概念问题:
- 用户可以更改流位置,从而破坏写入过程
您可以提出以下建议:
- 作者应该拥有流,如果写入文件而不是流,这将有效
- 拥有自己的内存流,因此它也可以写入流,好吧,但内存问题
我猜你明白了...
对我来说,唯一可行的方法是记录这方面,但我可能遗漏了一些东西,因此提出了这个问题。
问题:
如何使文件格式编写器能够写入流,同时保护自己免受其位置可能发生的变化?
我的建议是在 WavWriter
中保留一个内部职位字段。每次执行某些操作时,您都可以检查它是否与后备流中的位置匹配,如果不匹配则抛出异常。在每次写入操作结束时更新此值。
理想情况下,您还应该处理不支持搜索的流,但听起来您的设计无论如何都不允许这样做。在构造函数中检查 CanSeek
并在不支持搜索时抛出可能是个好主意。在使用之前验证任何参数通常是个好主意。
假设你想像这样编写一个 .WAV 文件格式的编写器:
using var stream = File.OpenRead("test.wav");
using var writer = new WavWriter(stream, ... /* .WAV format parameters */);
// write the file
// writer.Dispose() does a few things:
// - writes user-added chunks
// - updates the file header (chunk size) so the file is valid
这样做有一个概念问题:
- 用户可以更改流位置,从而破坏写入过程
您可以提出以下建议:
- 作者应该拥有流,如果写入文件而不是流,这将有效
- 拥有自己的内存流,因此它也可以写入流,好吧,但内存问题
我猜你明白了...
对我来说,唯一可行的方法是记录这方面,但我可能遗漏了一些东西,因此提出了这个问题。
问题:
如何使文件格式编写器能够写入流,同时保护自己免受其位置可能发生的变化?
我的建议是在 WavWriter
中保留一个内部职位字段。每次执行某些操作时,您都可以检查它是否与后备流中的位置匹配,如果不匹配则抛出异常。在每次写入操作结束时更新此值。
理想情况下,您还应该处理不支持搜索的流,但听起来您的设计无论如何都不允许这样做。在构造函数中检查 CanSeek
并在不支持搜索时抛出可能是个好主意。在使用之前验证任何参数通常是个好主意。