serialize(序列化)和deserialize(反序列化)
常用的两种序列化方法二进制和xml
BinaryFormatter
代码示例
[Serializable]
public class Person
{
public string name;
public int age;
[NonSerialized]
public string sex;
public void SayHi()
{
Console.WriteLine("我叫{0},今年{1}岁,我是{2}",this.name,this.age,this.sex);
}
}
namespace TestSerializable
{
class Program
{
//序列化
Person person = new Person();
person.age = 18;
person.name = "Jack";
person.sex = "man";
FileStream stream = new FileStream(@"c:\temp\Person.txt",FileMode.Create);
BinaryFormatter bform = new BinaryFormatter();
bform.Serialize(stream,person);
stream.Close();
//反序列化
FileStream destream = new FileStream(@"c:\temp\Person.txt",FileMode.Open,FileAccess.Read);
var p = (Person)bform.Deserialize(destream);
destream.Close();
p.SayHi()l
Console.ReadKey();
}
}
二进制序列化需引用System.Runtime.Serialization.Formatters.Binary
类被标注[Serializable],无需序列化的成员可用[NonSerialized]
序列化步骤:
1 创建对象及字段赋值
2 创建读写流
3 创建二进制对象
4 调用Serialize方法序列化对象
5 关闭读写流
反序列化步骤:
1 创建读写流
2 创建二进制对象
3 调用Deserialize反序列化
4 调用对象的字段等
5 关闭读写流
输出结果
注意 调用[NonSerialized]标记的成员,为默认值,比如string类型默认为null
XML
代码示例
public class Person
{
public string name;
public int age;
private string sex;
public Person()
{
}
public Person(string isex)
{
this.sex = isex;
}
public void SayHi()
{
Console.WriteLine("我叫{0},今年{1}岁,我是{2}",this.name,this.age,this.sex);
}
}
namespace TestSerializable
{
class Program
{
static void Main(string[] args)
{
//序列化
Person person = new Person("man");
person.age = 18;
person.name = "Jack";
FileStream stream = new FileStream(@"c:\temp\Person.xml",FileMode.Create);
XmlSerializer xs = new XmlSerializer(typeof(Person));
xs.Serialize(stream,person);
stream.Close();
//反序列化
FileStream destream = new FileStream(@"c:\temp\Person.xml",FileMode.Open,FileAccess.Read);
var p = (Person)xs.Deserialize(destream);
destream.Close();
p.SayHi();
Console.ReadKey();
}
}
}
xml序列化需引用System.Xml.Serialization 无需标记,非public的成员无法序列化
输出结果
总结:
1 序列化和反序列化适用于保存对象的当前状态
2 序列化可用于分布式系统中传输数据