【问题标题】:Attempting to deserialize an empty stream?试图反序列化一个空流?
【发布时间】:2015-03-07 00:10:33
【问题描述】:

我正在为我学校的游泳课组织构建一个程序,我正在使用 XML 序列化保存数据,但每次尝试反序列化数据时都会收到错误消息,它显示“运行时错误:尝试反序列化一个空流。”

这是我反序列化文件并将其放入窗口的代码。

    public StudentProfile()
    {
        InitializeComponent();
        using (var file = File.Open(FindStudent.studentName + ".xml", FileMode.OpenOrCreate))
        {
                var bformatter = new BinaryFormatter();

                var mp = (Person)bformatter.Deserialize(file);

                file.Close();

                nameBox.Text += mp.studentName;
                parentBox.Text += mp.parentName;
                yearBox.Text += mp.year;
                semesterBox.Text += mp.semester;
                sessionBox.Text += mp.session;
                ageGroupBox.Text += mp.ageGroup;
                sessionTimeBox.Text += mp.sessionTime;
                levelBox.Text += mp.level;
                paymentTypeBox.Text += mp.paymentType;
                amountBox.Text += mp.amount;
                checkNumberBox.Text += mp.checkNumber;
                datePaidBox.Text += mp.datePaid;

        }
    }

我在这里尝试了一些解决方案,BinaryFormatter: SerializationException,但它仍然不起作用。你们能帮帮我吗?

编辑:我用不同的方法解决了我的错误,这是我最终用来反序列化它的代码。如果有人要序列化代码,那我给它

    Stream file = File.Open(@"C:\Swimmers\" + FindStudent.studentName + ".xml", FileMode.Open);


                BinaryFormatter bformatter = new BinaryFormatter();

                Person mp = (Person)bformatter.Deserialize(file);

                file.Close();

                nameBox.Text += mp.studentName;
                parentBox.Text += mp.parentName;
                yearBox.Text += mp.year;
                semesterBox.Text += mp.semester;
                sessionBox.Text += mp.session;
                ageGroupBox.Text += mp.ageGroup;
                sessionTimeBox.Text += mp.sessionTime;
                levelBox.Text += mp.level;
                paymentTypeBox.Text += mp.paymentType;
                amountBox.Text += mp.amount;
                checkNumberBox.Text += mp.checkNumber;
                datePaidBox.Text += mp.datePaid;




    }

【问题讨论】:

  • 你为什么使用“OpenOrCreate”标志?如果该文件不存在,它不应该创建一个您下次会偶然发现的虚假空文件,对吧?除此之外,我认为您展示的代码太少,以至于人们无法真正提供帮助。可能不存在任何文件(在该文件夹中),也可能是 Person 类定义在序列化属性方面搞砸了。可能是序列化代码有问题。没有一个是可见的。
  • 您为什么要使用BinaryFormatter 来处理带有.xml 扩展名的文件?虽然无论名称如何,都可以将二进制数据存储在任何文件中,但使用 .xml 之类的标准扩展名(人们希望在其中找到 XML 数据)似乎可能会导致未来出现问题。
  • 错误信息可能是正确的。你实际上没有问过问题。我们有什么具体的技术问题?
  • 我假设如果您检查 File.exists(student.xml),您会发现该文件不存在,正如消息所暗示的那样。

标签: c# serialization


【解决方案1】:

使用 OpenOrCreate 的 FileMode,如果文件还不存在,它会创建没有内容的文件,因此会导致反序列化失败。最好使用:

if (File.Exists(FindStudent.StudentName + ".xml"))
{
   //Serialization logic
}
else
{
  //default logic; create the file but don't deserialize
  //expect the UI to be loaded blank
}

这可能是您遇到的错误,因为您正在反序列化一个新创建的空白文件。

【讨论】:

  • 文件不是空白的,它是在程序的其他地方创建的。它保存到的文件中确实有一串散列字符,它不是空的。
  • 我建议然后将模式更改为仅在那时打开,以防万一。我没有看到任何其他错误......文件中的任何特殊字符可能会导致它失败?
  • 对程序的其他部分进行了一些更改,包括将其从 OpenOrCreate 更改为 Open 工作,非常感谢。
【解决方案2】:

我强烈推荐你 System.Runtime.Serialization Namespace,来自 System.Runtime.Serialization.dll。它提供序列化器实现,例如 XMLJSON

以下示例使用 DataContractSerializer

[DataContract]
public class Student
{
    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public int Age { get; set; }

    public void Save(string filePath)
    {
        using (var fs = File.Open(filePath, FileMode.Create))
        {
            DataContractSerializer serializer = new DataContractSerializer(typeof (Student));
            serializer.WriteObject(fs, this);
        }
    }

    public static Student Load(string filePath)
    {
        Student result = null; //or default result
        try
        {
            using (var fs = File.OpenRead(filePath))
            {
                DataContractSerializer serializer = new DataContractSerializer(typeof (Student));
                result = serializer.ReadObject(fs) as Student;
            }
        }
        catch (Exception)
        {
        }
        return result;
    }
}

用法示例:

...
var filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "student1.xml");
var student = new Student
{
    Name = "Student1",
    Age = 10
};

student.Save(filePath);

var studentFromFile = Student.Load(filePath);
...

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 2023-03-07
    • 2015-11-11
    相关资源
    最近更新 更多