反序列化

反序列化文件到对象

序列化:C#对象 → XML文件保存到磁盘
反序列化:读取磁盘上的XML文件 → 还原成C#对象

生成出来的person.xml内容示例:

<?xml version="1.0"?>
<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Name>Mathieu</Name>
</Person>Code language: HTML, XML (xml)

两种读取方式

1:直接用FileStream读取文件
using System;
using System.IO;
using System.Xml.Serialization;

// 从本地xml文件反序列化得到Person对象
private Person LoadPersonFromXmlFile()
{
    // 获取APP私有存储目录
    string folder = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
    string filePath = Path.Combine(folder, "person.xml");

    // 文件不存在直接返回null
    if (!File.Exists(filePath))
    {
        return null;
    }

    using (FileStream fs = new FileStream(filePath, FileMode.Open))
    {
        XmlSerializer serializer = new XmlSerializer(typeof(Person));
        // Deserialize直接传入文件流,还原对象
        Person person = serializer.Deserialize(fs) as Person;
        return person;
    }
}Code language: JavaScript (javascript)
2:先读入MemoryStream
private Person LoadPersonByMemoryStream()
{
    string folder = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
    string filePath = Path.Combine(folder, "person.xml");
    if (!File.Exists(filePath)) return null;

    byte[] fileBytes = File.ReadAllBytes(filePath);
    using (MemoryStream ms = new MemoryStream(fileBytes))
    {
        XmlSerializer mySerializer = new XmlSerializer(typeof(Person));
        Person deserializeObj = (Person)mySerializer.Deserialize(ms);
        Console.WriteLine(deserializeObj.Name);
        return deserializeObj;
    }
}Code language: JavaScript (javascript)

示例

private void BtnLoad_Click(object sender, EventArgs e)
{
    Person p = LoadPersonFromXmlFile();
    if(p != null)
    {
        Console.WriteLine("读取到名字:" + p.Name);
    }
    else
    {
        Console.WriteLine("文件不存在");
    }
}Code language: JavaScript (javascript)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注