【发布时间】:2011-09-29 00:55:25
【问题描述】:
如果我想从二进制文件中填充结构,我会使用这样的东西:
using (BinaryReader br = new BinaryReader(File.Open(filename, FileMode.Open)))
{
myStruct.ID = br.ReadSingle();
myStruct.name = br.ReadBytes(20);
}
但是,我必须在反序列化之前将整个文件读入一个字节数组,因为我想做一些预处理。是否有任何托管方法可以从字节数组中填充我的结构,最好类似于上述方法?
【问题讨论】:
-
您应该考虑使您的类型可序列化。如果这是你感兴趣的东西,我会提供一个样本。有关二进制序列化,请参阅“BinaryFormatter”。
-
根据我的经验,
BinaryFormatter很少是序列化数据的正确选择。 -
这在很大程度上取决于具体情况。我通常需要一个定义明确的文件格式,所以我使用 Linq-to-Json 或 Linq-to-Xml 之类的东西在我的内存表示和文件格式之间进行转换。有时 protobuf 很好,因为它非常紧凑。在极少数情况下,如果您不需要版本控制并且可以忍受其具有深度侵入性的性质,
BinaryFormatter可能是正确的选择。游戏中的存档游戏是少数符合BinaryFormatterIMO 的案例之一。 -
BinaryFormatter的另一个大问题是您必须绝对信任该文件。创建该文件的人最有可能在您的程序上下文中执行代码。 -
Linq-To-Json/Xml 在技术上不是序列化。表示之间的转换是手动完成的,这显然需要更多的工作。但我认为对于稳定的文件格式,内存表示和存储格式的清晰分离通常值得额外的工作。
标签: c# binary managed deserialization