C# 五十一、序列化与反序列化

概念

序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。

序列化使其他代码可以查看或修改那些不序列化便无法访问的对象实例数据。

序列化就是为了保持对象的持久化;对象序列化只能针对对象的字段进行序列化。

序列化期间,对象将其当前状态写入临时或持久性存储区,以后可以通过从存储区中读取或反序列化对象的状态重新创建该对象。

注意:不是所有对象都能序列化 只有可序列化的对象才能序列化,在类声明上加[Serializable]。

二进制序列化步骤

1、创建序列化器

语法格式:BinaryFormatter bf = new BinaryFormatter();

2、创建文件流

  FileStream fs = new FileStream(“xx.bin”,fileMode.creat);

3、开始执行序列化

  bf.Serialize(文件流对象,执行序列化的对象());

反序列化步骤:

1、创建序列化器

2、创建文件的文件流 (读取的open)

3、执行反序列化

 

代码示例:

XML

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Xml.Serialization;

namespace Test_CSharp
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Person> list = new List<Person>();

            Person p1 = new Person();
            Person p2 = new Person();
            Person p3 = new Person();

            p1.Name = "张三";
            p1.Age = 20;
            list.Add(p1);

            p2.Name = "李四";
            p2.Age = 25;
            list.Add(p2);

            p3.Name = "王五";
            p3.Age = 30;
            list.Add(p3);

             //创建一个序列化器
            XmlSerializer x = new XmlSerializer(typeof(List<Person>));
            using (FileStream fs = new FileStream("Person.xml", FileMode.Create))
            {     
                //执行序列化           
                x.Serialize(fs, list);
            }
            Console.WriteLine("ok");

            //反序列化
            using (FileStream ff = new FileStream("Person.xml", FileMode.Open))
            {
                object o = x.Deserialize(ff);
                List<Person> li = o as List<Person>;
                foreach (Person item in li)
                {
                    Console.WriteLine("名字:{0}  年龄:{1}", item.Name, item.Age);
                }
                Console.ReadKey();
            }
        }
    }

    [Serializable]
    public class Person
    {
        string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        int _age;
        public int Age
        {
            get { return _age; }
            set { _age = value; }
        }

    }
}

--->
ok
名字:张三  年龄:20
名字:李四  年龄:25
名字:王五  年龄:30

二进制

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

namespace Test_CSharp
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Song> s = new List<Song>();

            Song s1 = new Song();
            s1.Sname = "光辉岁月";
            s1.Pname = "beyond";
            s.Add(s1);

            Song s2 = new Song();
            s2.Sname = "冰雨";
            s2.Pname = "刘德华";
            s.Add(s2);

            Song s3 = new Song();
            s3.Sname = "一次就好";
            s3.Pname = "杨宗纬";
            s.Add(s3);

            //创建一个序列化器
            BinaryFormatter bi = new BinaryFormatter();
            using (FileStream fi = new FileStream("Song.txt", FileMode.Create))
            {
                //执行序列化
                bi.Serialize(fi, s);
            }

            //反序列化
            using (FileStream ff = new FileStream("Song.txt", FileMode.Open))
            {
                object o = bi.Deserialize(ff);
                List<Song> li = o as List<Song>;
                foreach (Song item in li)
                {
                    Console.WriteLine("名字:{0}  歌曲:{1}", item.Pname, item.Sname);
                }
                Console.ReadKey();
            }
        }
    }
    [Serializable]
    public class Song
    {
        string _sname;
        public string Sname
        {
            get { return _sname; }
            set { _sname = value; }
        }

        string _pname;
        public string Pname
        {
            get { return _pname; }
            set { _pname = value; }
        }
    }
}

--->
名字:beyond  歌曲:光辉岁月
名字:刘德华  歌曲:冰雨
名字:杨宗纬  歌曲:一次就好

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值