public class L5Test:IXmlSerializable
{
public int test1;
//引用类型的数据不初始化的话默认为空,序列化时就不会存储该数据
public string test2;
//返回结构
public XmlSchema GetSchema()
{
//默认返回空
return null;
}
//反序列化调用的方法
public void ReadXml(XmlReader reader)
{
//自定义反序列化规则
//读属性
//this.test1 = int.Parse(reader["test1"]);
//this.test2 = reader["test2"];
//读节点
//方法一
//序列化调用这个方法时就来到了根节点
//reader.Read();//这时是读到test1节点
//reader.Read();//这时是读到test1节点中的值
//this.test1 =int.Parse(reader.Value);//得到当前内容的值
//reader.Read();//这时读到的是尾部包裹节点
//reader.Read();//这时读到test2节点
//reader.Read();//这时读到test2节点中的值
//this.test2=reader.Value;
//方法二
//while (reader.Read())
//{
// if (reader.NodeType == XmlNodeType.Element)
// {
// switch (reader.Name)
// {
// case "test1":
// reader.Read();
// this.test1 = int.Parse(reader.Value);
// break;
// case "test2":
// reader.Read();
// this.test2 = reader.Value;
// break;
// }
// }
//}
//读包裹元素节点
XmlSerializer s =new XmlSerializer(typeof(int));
XmlSerializer s2 = new XmlSerializer(typeof(string));
//跳过根节点
reader.ReadStartElement("test1");
test1 = (int)s.Deserialize(reader);
reader.ReadEndElement();
reader.ReadStartElement("test2");
test2 = s2.Deserialize(reader).ToString();
reader.ReadEndElement();
}
//序列化时调用的方法
public void WriteXml(XmlWriter writer)
{
//自定义序列化规则
//写属性
//writer.WriteAttributeString("test1",this.test1.ToString());
//writer.WriteAttributeString("test2", this.test2.ToString());
//写节点
//writer.WriteElementString("test1",this.test1.ToString());
//writer.WriteElementString("test2", this.test2);
//写包裹元素节点
//在test1节点中写入一个名字为int值为test1的节点
XmlSerializer s = new XmlSerializer(typeof(int));
writer.WriteStartElement("test1");
s.Serialize(writer, test1);
writer.WriteEndElement();
//在test2节点中写入一个名字为string值为test2的节点
XmlSerializer s2 = new XmlSerializer(typeof(string));
writer.WriteStartElement("test2");
s.Serialize(writer, test2);
writer.WriteEndElement();
}
}
public class L5 : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
//C#的XmlSerializer提供的可拓展内容
//可以让一些不能被序列化和反序列化的特殊类能被处理
//让特殊类继承IXmlSerializable接口并实现其中方法即可
string path = Application.persistentDataPath + "/L5Test.xml";
L5Test t = new L5Test();
t.test2 = "123";
//序列化
using (StreamWriter sw = new StreamWriter(path))
{
XmlSerializer s = new XmlSerializer(typeof(L5Test));
s.Serialize(sw, t);
}
//反序列化
using(StreamReader sr = new StreamReader(path))
{
XmlSerializer xs = new XmlSerializer(typeof(L5Test));
L5Test t2 = xs.Deserialize(sr) as L5Test;
}
}
}