序列化与反序列化

View Code
 1 private void button1_Click(object sender, EventArgs e)
 2         {
 3             List<string>  list = new List<string>();
 4             list.Add("DirectX游戏开发");
 5             list.Add("高等数学");
 6             list.Add("C++开发");
 7 
 8             BinaryFormatter bf = new BinaryFormatter();
 9             using(Stream stream = File.OpenWrite(@"c:\1.dat"))
10             {
11                 //序列化
12                 bf.Serialize(stream, list);
13             }
14             
15         }
16 
17         private void button2_Click(object sender, EventArgs e)
18         {
19             BinaryFormatter bf = new BinaryFormatter();
20             using (Stream stream = File.OpenRead(@"c:\1.dat"))
21             {
22                 //反序列化。De:反。
23                 //compile→decompile
24                 //compress→decompress。
25                 //encrypt一decrpt???
26                 object obj = bf.Deserialize(stream);
27                 List<string> list = (List<string>)obj;
28                 foreach (string s in list)
29                 {
30                     MessageBox.Show(s);
31                 }
32             }
33 
34             //foreach (string s in list)
35             //{
36             //    MessageBox.Show(s);
37             //}
38         }

 

•对象序列化是将对象(比如Person对象)转换为二进制数据,反序列化是将二进制数据还原为对象。对象是稍纵即逝的,不仅程序重启、操作系统重启会造成对象的消失,就是退出函数范围等都可能造成对象的消失,序列化/反序列化就是为了保持对象的持久化。就像用DV录像(序列化)和用播放器播放(反序列化)一样。
BinaryFormatter类有两个方法:
–void Serialize(Stream stream, object graph)对象graph序列化到stream中
–object Deserialize(Stream stream)将对象从stream中反序列化,返回值为反序列化得到的对象
 
 
 
可以序列化复杂的对象: 
private void button3_Click(object sender, EventArgs e)
        {
            //int i = DateTime.Now.Second;
            //BinaryFormatter bf = new BinaryFormatter();
            //using (Stream stream = File.OpenWrite(@"c:\i1.dat"))
            //{
            //    //序列化
            //    bf.Serialize(stream, i);
            //}


            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:\i1.dat"))
            {
                //序列化
                bf.Serialize(stream, p2);
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            //BinaryFormatter bf = new BinaryFormatter();
            //using (Stream stream = File.OpenRead(@"c:\i1.dat"))
            //{
            //    //反序列化。De:反。
            //    //compile→decompile
            //    //compress→decompress。
            //    //encrypt一decrpt???
            //    object obj = bf.Deserialize(stream);
            //    int i = (int)obj;
            //    i++;
            //    MessageBox.Show(i.ToString());
            //}

            BinaryFormatter bf = new BinaryFormatter();
            using (Stream stream = File.OpenRead(@"c:\i1.dat"))
            {
                //反序列化。De:反。
                //compile→decompile
                //compress→decompress。
                //encrypt一decrpt???
                Person p = (Person)bf.Deserialize(stream);

                MessageBox.Show(p.Parent.Name);
            }
        }

          }

    [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; }
    }

 

应用:可用于对象的深度拷贝

 

        pr
View Code
 1 private Person Person1;
 2 private Person Person2;
 3 
 4 
 5 private void button3_Click(object sender, EventArgs e)
 6         {
 7             //int i = DateTime.Now.Second;
 8             //BinaryFormatter bf = new BinaryFormatter();
 9             //using (Stream stream = File.OpenWrite(@"c:\i1.dat"))
10             //{
11             //    //序列化
12             //    bf.Serialize(stream, i);
13             //}
14 
15 
16             Person p1 = new Person();
17             p1.Name = "老布什";
18             p1.Age = 80;
19             p1.Id = 1;
20 
21             Person p2 = new Person();
22             p2.Name = "小布什";
23             p2.Age = 50;
24             p2.Id = 2;
25             p2.Parent = p1;
26 
27             Person1 = p2;
28 
29             BinaryFormatter bf = new BinaryFormatter();
30             using (Stream stream = File.OpenWrite(@"c:\i1.dat"))
31             {
32                 //序列化
33                 bf.Serialize(stream, p2);
34             }
35         }
36 
37         private void button4_Click(object sender, EventArgs e)
38         {
39             //BinaryFormatter bf = new BinaryFormatter();
40             //using (Stream stream = File.OpenRead(@"c:\i1.dat"))
41             //{
42             //    //反序列化。De:反。
43             //    //compile→decompile
44             //    //compress→decompress。
45             //    //encrypt一decrpt???
46             //    object obj = bf.Deserialize(stream);
47             //    int i = (int)obj;
48             //    i++;
49             //    MessageBox.Show(i.ToString());
50             //}
51 
52             BinaryFormatter bf = new BinaryFormatter();
53             using (Stream stream = File.OpenRead(@"c:\i1.dat"))
54             {
55                 //反序列化。De:反。
56                 //compile→decompile
57                 //compress→decompress。
58                 //encrypt一decrpt???
59                 Person p = (Person)bf.Deserialize(stream);
60 
61                 Person2 = p;
62                 MessageBox.Show(p.Parent.Name);
63             }
64         }
65 
66         private void button5_Click(object sender, EventArgs e)
67         {
68             bool b = object.ReferenceEquals(Person1, Person2);
69             MessageBox.Show(b.ToString());
70         }
71     }
72 
73     [Serializable]
74     class Person
75     {
76         public int Id { get; set; }
77         public string  Name { get; set; }
78         public int Age { get; set; }
79         public Person Parent { get; set; }
80         public Dog Pet { get; set; }
81     }
82 
83     [Serializable]
84     class Dog
85     {
86         public string Name { get; set; }
87     }

 

ivate Person Person1;
        private Person Person2;

private void button3_Click(object sender, EventArgs e)
        {
            //int i = DateTime.Now.Second;
            //BinaryFormatter bf = new BinaryFormatter();
            //using (Stream stream = File.OpenWrite(@"c:\i1.dat"))
            //{
            //    //序列化
            //    bf.Serialize(stream, i);
            //}


            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;

            Person1 = p2;

            BinaryFormatter bf = new BinaryFormatter();
            using (Stream stream = File.OpenWrite(@"c:\i1.dat"))
            {
                //序列化
                bf.Serialize(stream, p2);
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            //BinaryFormatter bf = new BinaryFormatter();
            //using (Stream stream = File.OpenRead(@"c:\i1.dat"))
            //{
            //    //反序列化。De:反。
            //    //compile→decompile
            //    //compress→decompress。
            //    //encrypt一decrpt???
            //    object obj = bf.Deserialize(stream);
            //    int i = (int)obj;
            //    i++;
            //    MessageBox.Show(i.ToString());
            //}

            BinaryFormatter bf = new BinaryFormatter();
            using (Stream stream = File.OpenRead(@"c:\i1.dat"))
            {
                //反序列化。De:反。
                //compile→decompile
                //compress→decompress。
                //encrypt一decrpt???
                Person p = (Person)bf.Deserialize(stream);

                Person2 = p;
                MessageBox.Show(p.Parent.Name);
            }
        }

        private void button5_Click(object sender, EventArgs e)
        { //比较对象是否是一个对象(深拷贝)
bool b = object.ReferenceEquals(Person1, Person2); MessageBox.Show(b.ToString()); } } [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] class Dog { public string Name { get; set; } }

 

 

扩展阅读:(1)http://www.yaosansi.com/post/1061.html  (2)http://blog.sina.com.cn/s/blog_645752e60100h4w9.html

 对象序列化就是将对象写到流里面

posted @ 2013-03-16 18:52  Big.Eagle  阅读(184)  评论(0)    收藏  举报