将二进制文件数据读入结构列表
Reading binary file data into List of Structs
我有一个简单的程序可以将图书馆书籍(TBook 类型)列表写入二进制文件,如下所示:
static void SaveToFile(List<TBook> lib)
{
FileStream currentFile;
BinaryWriter writerToFile;
currentFile = new FileStream("MyLibrary.bin", FileMode.Create);
writerToFile = new BinaryWriter(currentFile);
foreach (TBook book in lib)
{
writerToFile.Write(book.Title);
writerToFile.Write(book.Author);
writerToFile.Write(book.Genre);
writerToFile.Write(book.BookID);
}
writerToFile.Close();
currentFile.Close();
}
但是,当尝试读取二进制文件并将内容加载到列表中时,出现错误:
An unhandled exception of type 'System.IO.EndOfStreamException' occurred in mscorlib.dll
Additional information: Unable to read beyond the end of the stream.
这是我的子例程,它试图再次将二进制文件读回到结构中:
static List<TBook> LoadDataFromFile (List<TBook>library)
{
FileStream currentFile;
BinaryReader readerFromFile;
currentFile = new FileStream("MyLibrary.bin", FileMode.Open);
readerFromFile= new BinaryReader(currentFile);
while (currentFile.Position < currentFile.Length)
{
TBook CurrentRecord = new TBook();
CurrentRecord.Title = readerFromFile.ReadString();
CurrentRecord.Author = readerFromFile.ReadString();
CurrentRecord.Genre = readerFromFile.ReadString();
CurrentRecord.BookID = readerFromFile.ReadInt16();
library.Add(CurrentRecord);
}
readerFromFile.Close();
currentFile.Close();
return library;
}
我认为问题出在以下行:
while (currentFile.Position < currentFile.Length)
注:结构体设置如下:
struct TBook
{
public string Title;
public string Author;
public string Genre;
public int BookID;
}
当您将数据序列化为二进制时,您的反序列化代码必须完全遵循序列化代码;否则你的反序列化器开始从相邻的位置读取垃圾,最终导致异常或用错误的数据静默填充你的结构。
这对调用不匹配:
writerToFile.Write(book.BookID);
....
CurrentRecord.BookID = readerFromFile.ReadInt16();
很难看出这个问题,因为BinaryWriter
重载了Write
方法。由于 book.BookID
是 int
类型,Int32
的别名,因此对 Write
的调用被解析为 Write(Int32)
。所以对应的读也一定是Int32
,而不是Int16
:
CurrentRecord.BookID = readerFromFile.ReadInt32();
我有一个简单的程序可以将图书馆书籍(TBook 类型)列表写入二进制文件,如下所示:
static void SaveToFile(List<TBook> lib)
{
FileStream currentFile;
BinaryWriter writerToFile;
currentFile = new FileStream("MyLibrary.bin", FileMode.Create);
writerToFile = new BinaryWriter(currentFile);
foreach (TBook book in lib)
{
writerToFile.Write(book.Title);
writerToFile.Write(book.Author);
writerToFile.Write(book.Genre);
writerToFile.Write(book.BookID);
}
writerToFile.Close();
currentFile.Close();
}
但是,当尝试读取二进制文件并将内容加载到列表中时,出现错误:
An unhandled exception of type 'System.IO.EndOfStreamException' occurred in mscorlib.dll
Additional information: Unable to read beyond the end of the stream.
这是我的子例程,它试图再次将二进制文件读回到结构中:
static List<TBook> LoadDataFromFile (List<TBook>library)
{
FileStream currentFile;
BinaryReader readerFromFile;
currentFile = new FileStream("MyLibrary.bin", FileMode.Open);
readerFromFile= new BinaryReader(currentFile);
while (currentFile.Position < currentFile.Length)
{
TBook CurrentRecord = new TBook();
CurrentRecord.Title = readerFromFile.ReadString();
CurrentRecord.Author = readerFromFile.ReadString();
CurrentRecord.Genre = readerFromFile.ReadString();
CurrentRecord.BookID = readerFromFile.ReadInt16();
library.Add(CurrentRecord);
}
readerFromFile.Close();
currentFile.Close();
return library;
}
我认为问题出在以下行:
while (currentFile.Position < currentFile.Length)
注:结构体设置如下:
struct TBook
{
public string Title;
public string Author;
public string Genre;
public int BookID;
}
当您将数据序列化为二进制时,您的反序列化代码必须完全遵循序列化代码;否则你的反序列化器开始从相邻的位置读取垃圾,最终导致异常或用错误的数据静默填充你的结构。
这对调用不匹配:
writerToFile.Write(book.BookID);
....
CurrentRecord.BookID = readerFromFile.ReadInt16();
很难看出这个问题,因为BinaryWriter
重载了Write
方法。由于 book.BookID
是 int
类型,Int32
的别名,因此对 Write
的调用被解析为 Write(Int32)
。所以对应的读也一定是Int32
,而不是Int16
:
CurrentRecord.BookID = readerFromFile.ReadInt32();