序列化对象到文件

序列化对象到文件(Xamarin.Android XmlSerializer)

把C#对象和XML文本;可以保存到本地文件;XmlSerializer只序列化public属性;不需要[Serializable],这个是二进制序列化用的,属于多余。

1. Person实体类

using System.Xml.Serialization;

namespace StoringPreferences
{
    [XmlRoot("Person")] //可以不需要XmlRoot
    public class Person
    {
        // XmlSerializer 要求必须是 public 属性,要有 get;set;
        public string Name { get; set; }
        public int Age { get; set; }
    }
}Code language: JavaScript (javascript)

  1. [Serializable] XmlSerializer不使用,二进制序列化才需要,可以删掉。
  2. 必须有无参构造函数(C#默认自带),不能只有带参数构造。
  3. 只序列化public属性,private不会保存。

2. 内存中序列化和反序列化,没有写入磁盘

using System;
using System.IO;
using System.Xml.Serialization;

private void Btn_Click2(object sender, EventArgs e)
{
    using (var ms = new MemoryStream())
    {
        // 创建序列化器,传入对象类型
        XmlSerializer mySerializer = new XmlSerializer(typeof(Person));

        // 构造对象
        var someData = new Person();
        someData.Name = "Mathieu";
        someData.Age = 22;

        // 序列化:对象 → XML,写入内存流
        mySerializer.Serialize(ms, someData);

        // 流指针重置回到开头,否则读取不到数据!非常容易踩坑
        ms.Position = 0;

        // 反序列化:XML → 对象
        Person deserialize = (Person)mySerializer.Deserialize(ms);

        Console.WriteLine(deserialize.Name);
    }
}Code language: JavaScript (javascript)

序列化写完之后流指针在末尾,不重置Position=0,反序列化读取不到任何内容,报错。

3. 对象序列化保存到本地文件

private void SavePersonToFile(Person person)
{
    string path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
    string filename = Path.Combine(path, "person.xml");

    using (var fs = new FileStream(filename, FileMode.Create))
    {
        XmlSerializer ser = new XmlSerializer(typeof(Person));
        ser.Serialize(fs, person);
    }
}

// 从xml文件读取还原对象
private Person LoadPersonFromFile()
{
    string path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
    string filename = Path.Combine(path, "person.xml");

    if (!File.Exists(filename))
        return null;

    using (var fs = new FileStream(filename, FileMode.Open))
    {
        XmlSerializer ser = new XmlSerializer(typeof(Person));
        return ser.Deserialize(fs) as Person;
    }
}Code language: JavaScript (javascript)

总结

  1. MemoryStream内存操作,不写硬盘,程序关闭数据消失
  2. FileStream:写到物理文件,APP关闭后数据还在,持久化存储。

发表回复

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