C# BinaryReader - 数据可能在也可能不在二进制文件中

C# BinaryReader - data which may or may not be in binary file

我正在使用二进制文件来存储某些产品的测量数据。以前只有一种产品,现在我要save/load种产品。

我打算在文件的开头保存一些类型描述符,1个字节应该是绝对足够的,类型只有几个(2个,将来可能是3个或4个)。

问题是,我仍然需要能够在没有这个描述符的情况下加载旧的二进制文件。这是我的带有注释的旧代码,我想在其中检查描述符的存在,然后像这样对产品类型做出决定:

  1. 无描述符 -> 旧产品
  2. 描述符 = xxx -> 新产品 xxx

是否可以用这种格式保存描述符?我想调用 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();
     }

如果我理解正确的话,问题是你不知道你是在读取类型描述符(新文件)还是第一个数据值(旧文件)。

解决此问题的一个简单方法是为新文件选择不同的文件扩展名 - 但根据您的情况,这可能不是一个选项。

如果不是,您可以在产品描述符前添加一个从不(或不可能)出现在旧文件格式中的神奇值。像 ASCII 字符 "TYP" 后跟产品描述符字节这样简单的东西不太可能出现在旧文件格式中(以 double 值开头)。

您甚至可以选择将 double.MinValue 序列化为您的魔法值,因为 DateTime.FromOADate 只能读取

a value between negative 657435.0 through positive 2958465.99999999

这将完全排除错误地将旧文件识别为新文件的可能性。