二进制反序列化中的NullReferenceException

时间:2013-12-12 13:11:42

标签: c# serialization deserialization

所以我有一个Serializable类Student,我希望我的ReadFromFile方法反序列化我的文件,这样我就可以知道我的对象中已有多少条记录,所以当我想在我的数组中添加新记录时我就知道了什么是最后一个数组的索引,然后我可以将我的新记录放在索引号中。该函数在第二遍“Console.WriteLine(st2[j].FName + " " + st2[j].LName);”时给出了一个错误并告诉我

  

NullReferenceException未处理

它只是写了我记录中的第一项,而不是其余的。

public static int ReadFromFile()
{
    int j = 0;
    string path = @"students.dat";

    try
    {
        Students[] st2 = new Students[100];

        BinaryFormatter reader = new BinaryFormatter();
        FileStream input = new FileStream(path, FileMode.Open, FileAccess.Read);

        st2 = (Students[])reader.Deserialize(input);

        while (true)
        {
            st[j] = new Students();
            Console.WriteLine(st2[j].FName + " " + st2[j].LName);
            j++;
        }

        Console.WriteLine("there are " + j + "students in the file");

        input.Close();
        return j;
    }
    catch (FileNotFoundException)
    {
        Console.WriteLine("there are no student records yet.");
        return j;
    }
}

这是我的序列化方法:

public static void WriteInFileFromInput(Students[] x)
    {

        string path = @"students.dat";

        if (File.Exists(path))
        {
            BinaryFormatter Formatter = new BinaryFormatter();
            FileStream output = new FileStream(path, FileMode.Append, FileAccess.Write);

            Formatter.Serialize(output, st);

            output.Close();
        }

        else
        {
            BinaryFormatter Formatter = new BinaryFormatter();
            FileStream output = new FileStream(path, FileMode.CreateNew, FileAccess.Write);

            Formatter.Serialize(output, st);

            output.Close();
        }
    }

1 个答案:

答案 0 :(得分:0)

正确的循环应如下所示(假设数据已正确序列化):

foreach (var student in st2) // Replaces the while loop in the OP
{
    Console.WriteLine(student.FName + " " + student.LName);
    ++j;
}

但是,我认为序列化中存在错误,因此仍会产生空引用异常。 如果是这样,你可以发布序列化数据的代码吗?