C# Xml进行序列化与反序列化

使用XmlSerializer进行串行化
    关于格式化器还有一个问题,假设我们需要XML,有两中方案:要么编写一个实现IFormatter接口的类,采用的方式类似于SoapFormatter类,但是没有你不需要的信息;要么使用库类XmlSerializer,这个类不使用Serializable属性,但是它提供了类似的功能。
    如果我们不想使用主流的串行化机制,而想使用XmlSeralizer进行串行化我们需要做一下修改:
    a.添加System.Xml.Serialization命名空间。
    b.Serializable和NoSerialized属性将被忽略,而是使用XmlIgnore属性,它的行为与NoSerialized类似。
    c.XmlSeralizer要求类有个默认的构造器,这个条件可能已经满足了。
序列化:

XmlSerializer xs = new XmlSerializer(typeof(List<Peoson>));
xs.Serialize(fs, listPers);
反序列化:

XmlSerializer xs = new XmlSerializer(typeof(List<Peoson>));
List<Peoson> list = xs.Deserialize(fs) as List<Peoson>;

using UnityEngine;
using System;
using System.Collections;
using System.IO;
using System.Xml.Serialization;
using System.Xml;
using System.Collections.Generic;

[Serializable]      // 表示该类可以被序列化
[XmlRoot("AAA")]    // 设置为XML中的根元素名称
public class Person
{
	private string name;
	private int age;

//	[XmlElement("abc")]
	public int abc = 1000; // 类的public属性字段都可以被序列化

	//	[XmlAttribute("Name")]  设置作为xml中的属性
	public string Name
	{
		get { return name;}
		set { name = value;}
	}
	//	[XmlElement("Age")]  设置作为XML中的元素(默认状态)
	public int Age
	{
		get { return age;}
		set { age = value;}
	}
	public Person() { }
	public Person(string name, int age)
	{
		this.name = name;
		this.age = age;
	}

	public void SayHi()
	{
		Debug.LogFormat ("我是{0}, 今年{1}岁", name, age);
	}
}


public class XmlSerialize : MonoBehaviour {

	string filePath = Directory.GetCurrentDirectory() + "/XmlFile.txt";
	string filePath2 = Directory.GetCurrentDirectory() + "/XmlClassFile.txt";

	// Use this for initialization
	void Start () {
		List<Person> listPers = new List<Person> ();
		Person per1 = new Person ("张三", 18);
		Person per2 = new Person ("李四", 20);
		listPers.Add (per1);
		listPers.Add (per2);
		SerializeMethod (listPers);  // 序列化
		DeserializeMethod();  // 反序列化

//		SerializeClassMethod (per1);
//		DeserializeClassMethod ();
		Debug.Log("Done ! ");
	}

	void DeserializeClassMethod()     // Xml实体类反序列化
	{
		FileStream fs = new FileStream (filePath, FileMode.Open);
		XmlSerializer xs = new XmlSerializer(typeof(Person));
		Person p = xs.Deserialize (fs) as Person;
		if (p != null) 
		{
			p.SayHi ();
		}
		fs.Close ();
	}


	void SerializeClassMethod(Person p)   // Xml实体类序列化
	{
		FileStream fs = new FileStream (filePath2, FileMode.Create);
		XmlSerializer xs = new XmlSerializer(typeof(Person));
		xs.Serialize(fs, p);
		fs.Close ();
	}


	void DeserializeMethod()     // Xml列表反序列化
	{
		FileStream fs = new FileStream (filePath, FileMode.Open);
		XmlSerializer xs = new XmlSerializer(typeof(List<Person>));
		List<Person> listPers = xs.Deserialize (fs) as List<Person>;
		if (listPers != null) 
		{
			for (int i = 0; i < listPers.Count; i++)
			{
				listPers [i].SayHi ();
			}
		}
		fs.Close ();
	}

	void SerializeMethod(List<Person> listPers)   // Xml列表序列化
	{
		FileStream fs = new FileStream (filePath, FileMode.Create);
		XmlSerializer xs = new XmlSerializer(typeof(List<Person>));
		xs.Serialize(fs, listPers);
		fs.Close ();
	}
	
	// Update is called once per frame
	void Update () {
	
	}
}

Xml列表序列化的内容:



Xml实体类序列化的内容:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值