我使用二进制文件存储某些产品的测量数据。该产品是之前唯一的一种,现在我必须能够保存/加载更多类型的产品。
我要在文件的开头保存一些类型描述符,1个字节应该是绝对足够的,将来只有几种类型(2,可能是3或4)。
问题是,我仍然需要能够在没有此描述符的情况下加载旧的二进制文件。这是我的旧代码和评论,我想检查描述符的存在,然后做出关于这样的产品类型的决定:
是否可以以这种格式保存描述符?我想调用reader.PeekChar()
只是一种可能性,因为没有移动到下一个字节,但我不确定在这种情况下如何使用它。
BinaryReader reader;
using (reader = new BinaryReader(File.Open(header.path, FileMode.Open, FileAccess.Read)))
{
// ...
// check presence of product type descriptor
// make a decision of type
// ...
DateTime measTime = DateTime.FromOADate(reader.ReadDouble());
double diameter = reader.ReadDouble();
double plusToler = reader.ReadDouble();
double minusToler = reader.ReadDouble();
}
答案 0 :(得分:1)
如果我理解correclty的问题是你不知道你是在读取类型描述符(新文件)还是第一个数据值(旧文件)。
解决此问题的一种简单方法是为新文件选择不同的文件扩展名 - 但根据您的情况,这可能不是一种选择。
如果没有,您可以在产品描述符前添加一个魔术值,该值不会(或不太可能)出现在旧文件格式中。像ASCII字符"TYP"
一样简单,后跟产品描述符字节的东西不太可能以旧文件格式出现(以double
值开头)。
您甚至可以选择序列化double.MinValue
作为您的神奇值,因为DateTime.FromOADate
只能读取
介于负值657435.0到正数2958465.99999999之间的值
这将完全排除错误地将旧文件识别为新文件。