序列化对象到文件(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)
[Serializable]XmlSerializer不使用,二进制序列化才需要,可以删掉。- 必须有无参构造函数(C#默认自带),不能只有带参数构造。
- 只序列化
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)
总结
MemoryStream:内存操作,不写硬盘,程序关闭数据消失FileStream:写到物理文件,APP关闭后数据还在,持久化存储。
Previous: 文件读写 Xamarin.Android
Next: 反序列化