对象序列化

为什么要序列化?

对象序列化,用于把数据序列化,按特定格式存储。把复杂的对象转换流,方便我们的存储和交流。例如:

定义两个类

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、不建议使用自动属性。(每次生成的字段可能不一样,影响反序列化)

 

posted @ 2017-03-08 15:10  MFK  阅读(120)  评论(0编辑  收藏  举报