首页 > 代码库 > C# XmlSerializer序列化浅析

C# XmlSerializer序列化浅析

C# 中使用 XmlSerializer 实现类和xml文件的序列化和反序列化,使用起来非常简单。

C# XmlSerializer实现序列化:

XmlSerializer xml = new XmlSerializer(typeof(ClassName));  

FileStream fs = new FileStream(@"d:\t.xml",FileMode.Create);  

xml.Serialize(fs, new Class());  

fs.Close(); 

C# XmlSerializer实现反序列化

FileStream fs = new FileStream(@"d:\t.xml", FileMode.Open);  

XmlSerializer xml = new XmlSerializer(typeof(ClassName));  

ClassName t = (ClassName)xml.Deserialize(fs); 

C# XmlSerializer类与主流的序列化类的几个不同点是:

1、不需要Serializable属性,使用XmlIgnore属性标记不需要序列化的属性。

2、该类不能安全地访问私有变成员,所以学要将私有成员改为公共成员,或者提供合适的公共特性。

3、要求被序列化的类要有一个默认的构造器。

 

下面上个实例,直接上代码:

1、需要序列化的类

[XmlRoot("Person")]
public class Person
{
  [XmlElement("name")]
  public string Name { get; set; }

  [XmlAttribute("sex")]
  public byte Sex { get; set; }

  [XmlAttribute("age")]
  public int Age { get; set; }

  [XmlText]
  public string Description { get; set; }

  [XmlElement("child")]
  public List<Person> Childrens { get; set; }

  [XmlElement("childlist")]
  public ChildList ChildList { get; set; }
}

请注意红色标注的属性,生成的xml文件是不一样的^_^

[XmlRoot("Childs")]
public class ChildList
{
  [XmlElement("person")]
  public List<Person> Childs { get; set; }
}

2、声明对象

Person person = new Person { Name="张三", Sex=1, Age=25, Description="我是一名中国人!!" };
person.Childrens = new List<Person>();
person.Childrens.Add(new Person { Name="Boy", Sex=1, Age=5, Description="我是男孩" });
person.Childrens.Add(new Person { Name="Girl", Sex=0, Age=10, Description="我是女孩" });

person.ChildList = new ChildList();
person.ChildList.Childs = new List<Person>();
person.ChildList.Childs.Add(new Person { Name = "Jon", Sex = 1, Age = 5 });
person.ChildList.Childs.Add(new Person { Name = "KG", Sex = 0, Age = 10 });

3、序列化

string path = System.AppDomain.CurrentDomain.BaseDirectory;
using (FileStream fs = new FileStream(path + "parson.xml", FileMode.Create))
{
  serializer.Serialize(fs, person);
  fs.Close();
}

4、反序列化

using (FileStream fs = new FileStream(path + "parson.xml", FileMode.Open))
{
  person = (Person)serializer.Deserialize(fs);
  fs.Close();
}