C# 当我更新记录时,会出现以下错误;二进制流';0';不包含有效的BinaryHeader";

C# 当我更新记录时,会出现以下错误;二进制流';0';不包含有效的BinaryHeader";,c#,C#,这是一节课 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; namespace Question { 这是写记录的方法 [Serializable]

这是一节课

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

namespace Question
{
这是写记录的方法

 [Serializable]
    public class Employee
    {
        public Int32 Id { get; set; }
        public string Name { get; set; }
        public string LastName { get; set; }

    }
这是方法更新

public class Write
{
public void WriteRecord(Employee emp)
{
if (!File.Exists("records.dat"))
{
    FileStream savefile = new 
    FileStream("records.dat", FileMode.OpenOrCreate,    FileAccess.Write);
    BinaryFormatter formatter = new BinaryFormatter();
    formatter.Serialize(savefile, emp);
    savefile.Flush();
    savefile.Close();
    savefile.Dispose();
    formatter = null;
}
else
{
FileStream savefile = new 
FileStream("records.dat", FileMode.Append, FileAccess.Write);
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(savefile, emp);
savefile.Flush();
savefile.Close();
savefile.Dispose();
formatter = null;
}
}        

由于缺少缩进,难以读取。更改员工实例后,序列化员工记录的大小将与原始员工记录的大小不同。调用UpdateRecord时,会覆盖现有员工记录,这可能会损坏文件。这无法工作。您希望文件中的记录大小相同。它们不是,字符串才是问题所在。要考虑一个简单的dBASE引擎,比如SQL压缩。
public void UpdateRecord(Employee employ,Int32 id)
{
BinaryFormatter formatter = new BinaryFormatter();
long record = 0;
//      
FileStream readfile = new 
FileStream("records.dat", FileMode.Open, FileAccess.ReadWrite);

while (record < readfile.Length)
{
record = readfile.Position;
readfile.Seek(record, SeekOrigin.Begin);
employ = (Employee)formatter.Deserialize(readfile);

if (employ.Id == id)
{
formatter.Serialize(readfile, employ);
readfile.Flush();
readfile.Close();
readfile.Dispose();
formatter = null;
return;
}                
}
}
public void ReadRecord()
{
BinaryFormatter formatter = new BinaryFormatter();
long record = 0;
Employee emp = new Employee();
FileStream readfile = new 
FileStream("records.dat", FileMode.Open, FileAccess.ReadWrite);
while (record < readfile.Length)
{
readfile.Seek(record, SeekOrigin.Begin);
emp = (Employee)formatter.Deserialize(readfile);

Console.WriteLine("Number: " + emp.Id);
Console.WriteLine("Name: " + emp.Name);
Console.WriteLine("Last Name: " + emp.LastName);
Console.WriteLine("=====================================");

record = readfile.Position;
}
readfile.Flush();
readfile.Close();
readfile.Dispose();
formatter = null;
}
public void GetRecord(ref Employee emp, int id)
{
BinaryFormatter formatter = new BinaryFormatter();
long record = 0;
Employee emplea = new Employee();
FileStream readfile = new 
FileStream("records.dat", FileMode.Open, FileAccess.ReadWrite);
while (record < readfile.Length)
{
readfile.Seek(record, SeekOrigin.Begin);
emplea = (Employee)formatter.Deserialize(readfile);
if (emplea.Id == id)
{
emp = emplea;
readfile.Flush();
readfile.Close();
readfile.Dispose();
formatter = null;
return;
}
record = readfile.Position;
}            

}
}
}
namespace Question
{
class Program
{
static void Main(string[] args)
{
Employee exaple1 = new Employee();
exaple1.Id = 1;
exaple1.Name = "Juan";
exaple1.LastName = "Perez";
Write record = new Write();
record.WriteRecord(exaple1);

Employee exaple2= new Employee();
exaple2.Id = 2;
exaple2.Name = "Jose";
exaple2.LastName = "Medina";

record.WriteRecord(exaple2);

Employee exaple3 = new Employee();
exaple3.Id = 3;
exaple3.Name = "Marcos";
exaple3.LastName = "Paniagua";

record.WriteRecord(exaple3);

Employee exaple4 = new Employee();
exaple4.Id = 4;
exaple4.Name = "Nurys";
exaple4.LastName = "Santnaa";

Employee exaple5 = new Employee();
exaple4.Id = 5;
exaple4.Name = "Carlos";
exaple4.LastName = "Encarnacion";

record.WriteRecord(exaple5);

Console.WriteLine("Records Add");
Console.ReadKey();

exaple1.Id = 2;
exaple1.Name = "JUAN RAMON";
exaple1.LastName = "GOMEZ DIAZ";
record.UpdateRecord(exaple1, 2);

Console.WriteLine("Record Updated...");
Console.ReadKey();

record.ReadRecord();

Console.WriteLine("Record Reads...");
Console.ReadKey();

Employee emplea = new Employee();
record.GetRecord(ref emplea, 4);

Console.WriteLine("Number: " + emplea.Id);
Console.WriteLine("Number: " + emplea.Name);
Console.WriteLine("Number: " + emplea.LastName);
Console.WriteLine("Get Record");
Console.ReadKey();

}
}
}