IXmlSerializable接口

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;
        }
    }
}
posted @ 2025-03-24 19:27  cannedmint  阅读(27)  评论(0)    收藏  举报