.NET-12-序列化与反序列化

        /* 什么是序列化和反序列化
         * 序列化:把对象转换为字节序列的过程称为对象的序列化
         * 反序列化:把字节序列恢复为对象的过程称为对象的反序列化
         *
         * 什么情况下需要序列化
         * 当你想把的内存中的对象状态保存到一个文件中或者数据库中时候
         * 当你想用套接字在网络上传送对象的时候
         * 当你想通过RMI传输对象的时候
         *
         * 序列化有多重方式:二进制序列化,xml序列化,json序列化,
         * 序列化的时候只序列化数据,方法是不会被序列化的
         * 序列化后只是把对象的存储格式改变了,对于对象的存储对象并没有改变
         * 已经序列化的数据,就可以根据相同的格式进行反序列化
         *
         *
         * 二进制序列化就是把对象转换成二进制数据流
         * 反序列化就是将二进制数据转换成对象
         * 二进制序列化的时候,被序列化的对象和他的父类必须被标记为[Serializable]才可以进行二进制序列化
         * 如果对象中的某个字段不想被序列化,则吧该字段标记为[NonSerialized]
         * XML与JSON序列化的时候不用进行标记
         *
         */

public class 序列化与反序列化
    {

        public static void GetXLH()
        {

            #region   序列化
            //PersongXLH per = new PersongXLH();
            //per.Age = 18;
            //per.Name = "盈盈";
            //per.Gender = '女';


            //Console.WriteLine("JSON序列化:");
            ////JSON序列化,需要引入System.Web.Extensions
            //JavaScriptSerializer jas = new JavaScriptSerializer();
            //string str = jas.Serialize(per);
            //Console.WriteLine(str);


            //Console.WriteLine("XML序列化:");
            ////创建XML序列化器
            //XmlSerializer xml = new XmlSerializer(typeof(PersongXLH));
            //using (FileStream fWrite = new FileStream(@"C:\Users\Administrator\Desktop\test\练习用文件\XML序列化.xml", FileMode.OpenOrCreate, FileAccess.Write))
            //{
            //    xml.Serialize(fWrite, per);
            //}


            PersongEJZ ejz = new PersongEJZ();
            ejz.Age = 18;
            ejz.Name = "盈盈";
            ejz.Gender = '女';
            Console.WriteLine("二进制序列化:");
            //创建二进制序列化器
            BinaryFormatter bf = new BinaryFormatter();
            using (FileStream fWrite = new FileStream(@"C:\Users\Administrator\Desktop\test\练习用文件\二进制序列化.bin", FileMode.OpenOrCreate, FileAccess.Write))
            {
                bf.Serialize(fWrite, ejz);
            }
            #endregion   序列化

            #region   反序列化
            //二进制在反序列话的时候必须要获取数据源对象的程序及
            //这是应为在二进制序列化的时候只包含数据信息,并不包含该对象类型相关的信息,比如对象的父类,实现的接口,对象中包含的方法
            //为了反序列化的时候还原这些信息,必须通过这个对象的程序及信息来获取
            //创建序列化器
            BinaryFormatter bff = new BinaryFormatter();
            //创建一个读取流
            using (FileStream fRead = new FileStream(@"C:\Users\Administrator\Desktop\test\练习用文件\二进制序列化.bin", FileMode.OpenOrCreate, FileAccess.Read))
            {
                //读取数据,返回结果为object类型
                object obj = bff.Deserialize(fRead);
                PersongEJZ fx = obj as PersongEJZ;
                Console.WriteLine(fx.Name);
                Console.WriteLine(fx.Age);
                Console.WriteLine(fx.Gender);
            }


            #endregion   反序列化


        }
    }


    /// <summary>
    /// 标识出类PersongEJZ可以被序列化
    /// 如果没有[Serializable]是不能被进行二进制序列化的
    /// 但是可以进行XML序列化和JSON序列化
    /// 如果该类为子类,则他的父类也必须标记为可序列化
    /// </summary>
    [Serializable]
    public class PersongEJZ
    {
        /// <summary>
        /// 使用[NonSerialized]标记该字段不能被序列化
        /// </summary>
        [NonSerialized]
        private string _name;

        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }


        private int _age;

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


        private char _gender;

        public char Gender
        {
            get { return _gender; }
            set { _gender = value; }
        }

        /// <summary>
        /// 被序列化的对象的属性也必须是可以序列化的
        /// </summary>
        public Car DABEN
        {
            get;
            set;
        }

        /// <summary>
        /// 如果是一个方法,切尔返回值类型为Car
        /// 这时候就算Eat没有标记为可序列话也不会报错
        /// 这是因为方法不参与序列化
        /// </summary>
        /// <returns></returns>
        public Eat GetEat()
        {
            return new Eat();
        }
    }


    /// <summary>
    /// 车的类
    /// </summary>
    [Serializable]
    public class Car
    {

    }

    /// <summary>
    /// 吃的东西的类
    /// </summary>
    public class Eat
    {

    }

    /// <summary>
    /// 序列化人的类
    /// </summary>
    public class PersongXLH
    {
        private string _name;

        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }


        private int _age;

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


        private char _gender;

        public char Gender
        {
            get { return _gender; }
            set { _gender = value; }
        }
    }

猜你喜欢

转载自blog.csdn.net/m0_37532448/article/details/81188173