对象序列化与反序列化

  • 对象序列化是将对象(比如Person对象)转换为二进制数据,反序列化是将二进制数据还原为对象。对象是稍纵即逝的,不仅程序重启、操作系统重启会造成对象的消失,就是退出函数范围等都可能造成对象的消失,序列化/反序列化就是为了保持对象的持久化。就像用DV录像(序列化)和用播放器播放(反序列化)一样。
  • BinaryFormatter类有两个方法:

–    void Serialize(Stream stream, object graph)对象graph序列化到stream中

–    object Deserialize(Stream stream)将对象从stream中反序列化,返回值为反序列化得到的对象

  • 不是所有对象都能序列化,只有可序列化的对象才能序列化,在类声明上添加[Serializable],对象的属性、字段的类型也必须可序列化。
  • 反序列的项目中必须有同样的类,否则不能反序列化。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

namespace 序列化反序列化
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnSerialize_Click(object sender, EventArgs e)
        {
            List<string> list = new List<string>();
            list.Add("美国与中国");
            list.Add("历代经济变革得失");
            list.Add("抉择时刻");


            BinaryFormatter bf = new BinaryFormatter();
            using (Stream stream = File.OpenWrite(@"C:\Users\LeiXin\Desktop\1.dat"))
            {
                //序列化
                bf.Serialize(stream, list);
            }
            MessageBox.Show("序列化成功");
        }

        private void btnDeserialize_Click(object sender, EventArgs e)
        {
            BinaryFormatter bf = new BinaryFormatter();
            using (Stream stream = File.OpenRead(@"C:\Users\LeiXin\Desktop\1.dat"))
            {
                //反序列化
                object obj = bf.Deserialize(stream);
                List<string> lists = (List<string>)obj;
                foreach (var list in lists)
                {
                    MessageBox.Show(list);
                }
            }
        }

        private void btnObjectSerialize_Click(object sender, EventArgs e)
        {
            Person p1 = new Person();
            p1.Name = "老布什";
            p1.Age = 80;
            p1.Id = 1;

            Person p2 = new Person();
            p2.Name = "小布什";
            p2.Age = 50;
            p2.Id = 2;
            p2.Parent = p1;

            BinaryFormatter bf = new BinaryFormatter();
            using (Stream stream = File.OpenWrite(@"C:\Users\LeiXin\Desktop\i1.dat"))
            {
                bf.Serialize(stream, p2);
                MessageBox.Show("对象序列化成功!");
            }
        }

        private void btnObjectDeseralize_Click(object sender, EventArgs e)
        {
            BinaryFormatter bf = new BinaryFormatter();
            using (Stream stream = File.OpenRead(@"C:\Users\LeiXin\Desktop\i1.dat"))
            {
                Person p=(Person)bf.Deserialize(stream);
                MessageBox.Show(p.Parent.Name);
            }
        }
    }
    [Serializable]//要序列化,必须在该类的前面标记[Serializable]
    class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
        public Person Parent { get; set; }
        public Dog Pet { get; set; }
    }
    [Serializable]//不是所有对象都能序列化,只有可序列化的对象才能序列化,在类声明上添加[Serializable],对象的属性、字段的类型也必须可序列化。

    class Dog
    {
        public string Name { get; set; }
    }
}

posted @ 2013-12-16 21:01  LEITION  阅读(222)  评论(0编辑  收藏  举报