将二进制文件数据读入结构列表

我有一个简单的过程,可以将库书列表(类型为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();
    }

但是,当尝试读取二进制文件并将内容加载到列表中时,出现错误:

mscorlib.dll中发生了'System.IO.EndOfStreamException'类型的未处理异常

附加信息:在流的末尾无法读取。

这是我的子例程,尝试再次将二进制文件读回Struct:

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的设置如下:

struct TBook
    {
        public string Title;
        public string Author;
        public string Genre;
        public int BookID;
    }
谢尔盖·卡里尼琴科(Sergey Kalinichenko)

当您将数据序列化为二进制时,反序列化代码必须严格遵循序列化代码;否则,解串器将开始从相邻位置读取垃圾,最终导致异常或使用错误数据静默填充结构。

这对电话不匹配:

writerToFile.Write(book.BookID);
....
CurrentRecord.BookID = readerFromFile.ReadInt16();

很难看到此问题,因为BinaryWriterWrite方法重载了由于book.BookID是类型int的别名Int32,因此对的调用Write解析为Write(Int32)因此,相应的读取还必须读取Int32,而不是Int16

CurrentRecord.BookID = readerFromFile.ReadInt32();

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章