对象序列化
为什么要序列化?
对象序列化,用于把数据序列化,按特定格式存储。把复杂的对象转换流,方便我们的存储和交流。例如:
定义两个类
public class Person
{
public int Age { get; set; }
public string Name { get; set; }
private string _gender;
public string Gender
{
get { return _gender; }
set { _gender = value; }
}
public void SayHi() { }
public Car CarName { get; set; }
}
public class Car
{
public string Name { get; set; }
public Car(string name)
{
this.Name = name;
}
}
Person p=new Person();
p.Name="婷婷";p.Age=18;p.CarName=new Car("BMW");
一、Json序列化
using System.Web.Script.Serialization;
JavaScriptSerializer json = new JavaScriptSerializer();// string p1= json.Serialize(p); // 直接调用JavaScriptSerializer的Serialize方法
Console.WriteLine("json serialize============================="); Console.WriteLine(p1);
二、xml序列化
Console.WriteLine("xml serialize============================");
XmlSerializer xml = new XmlSerializer(typeof(Person));
using (FileStream fs=new FileStream("serialize.xml",FileMode.Create,FileAccess.Write))
{//使用文件流存入xml文件
xml.Serialize(fs, p);//直接调用Serialize方法,和json序列步骤差不多。
}
三、二进制序列化
Console.WriteLine("binary serialize========================");
BinaryFormatter binary = new BinaryFormatter(); //使用 binaryFormatter
using (FileStream fs=new FileStream("binary.bin",FileMode.Create,FileAccess.Write)) //存入.bin文件
{
binary.Serialize(fs,p);
}
1.被序列化的类型必须标记为可序列化的 (在类型定义前加[serializable])
[Serializable]
public class Person
{
}
2.被序列化的类型的所有父类也必须标记为可序列化的(object也标记了)
3.不想让属性参与序列化,在前面 加[NonSerialized](不能用自动属性)
[NonSerialized]
private string _gender;
public string Gender
{
get { return _gender; }
set { _gender = value; }
}
二进制反序列化:
// 必须获取被序列化对象的类型所在的程序集。因为只有数据,没有方法、接口、继承相关信息。
BinaryFormatter bf = new BinaryFormatter();
using (FileStream fs=new FileStream("binary.bin",FileMode.Open))
{
object obj= bf.Deserialize(fs);
Person per = obj as Person;
Console.WriteLine(per.Age);
Console.WriteLine(per.Name);
Console.WriteLine(per.Gender);
Console.ReadKey();
}
注意:
1、要序列化的类型必须标记为[Serializable]
2、该类型的父类也必须标记为[Serializable]
3、该类型中的所有成员的类型也必须标记为[Serializable]
4、序列化只是改变了存储格式,并没有改变存储的内容。而且只序列化数据(字段)
5、不建议使用自动属性。(每次生成的字段可能不一样,影响反序列化)
浙公网安备 33010602011771号