C#对象反序列化与对象序列化

C#对象反序列化与对象序列化

对象序列化的介绍

1、.net支持对象序列化的几种方式

二进制序列化  SOAP序列化  XML序列化

2、几种序列化的区别

二进制格式和SOAP格式可序列化一个类型的所有可序列化字段,不管

 

 

 

使用二进制方式的序列化与反序列化的代码

using System;

using System.Collections.Generic;

using System.IO;

using System.Linq;

using System.Runtime.Serialization.Formatters.Binary;

using System.Text;

using System.Threading.Tasks;

 

namespace ConsoleApplication1

{

    class Program

    {

        static void Main(string[] args)

        {

            //创建Programmer列表,并添加对象

            List<Programmer> list = new List<Programmer>();

            list.Add(new Programmer("李志伟", true, "C#"));

            list.Add(new Programmer("Coder2", false, "C++"));

            list.Add(new Programmer("Coder3", true, "Java"));

            //使用二进制序列化对象

            string fileName = @"E:\大一\作业\Programmers.dat";//文件名称与路径

            Stream fStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite);

            BinaryFormatter binFormat = new BinaryFormatter();//创建二进制序列化器

            binFormat.Serialize(fStream, list);

            //使用二进制反序列化对象

            list.Clear();//清空列表

            fStream.Position = 0;//重置流位置

            list = (List<Programmer>)binFormat.Deserialize(fStream);//反序列化对象

            foreach (Programmer p in list)

            {

                Console.WriteLine(p);

            }

            Console.Read();

        }

       

        [Serializable //必须添加序列化特性

        public class Person

        {

            private string Name;//姓名

            private bool Sex;//性别,是否是男

            public Person(string name, bool sex)

            {

                this.Name = name;

                this.Sex = sex;

            }

            public override string ToString()

            {

                return "姓名:" + this.Name + "\t性别:" + (this.Sex ? "男" : "女");

            }

        }

        [Serializable //必须添加序列化特性

        public class Programmer : Person

        {

            private string Language;//编程语言

            public Programmer(string name, bool sex, string language)

                : base(name, sex)

            {

                this.Language = language;

            }

            public override string ToString()

            {

                return base.ToString() + "\t编程语言:" + this.Language;

            }

        }

       

    }

}

效果

 

 

使用SOAP方式的序列化和反序列化

using System;

using System.Collections.Generic;

using System.IO;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Runtime.Serialization.Formatters.Soap;

namespace ConsoleApplication2

{

    class Program

    {

        static void Main(string[] args)

        {

            //实例化对象

            Programmer p = new Programmer("李志伟", true, "C、C#、C++、Java");

            //使用SOAP序列化对象

            string fileName = @"E:\大一\作业\Programmers.xml";//文件名称与路径

            Stream fStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite);

            SoapFormatter soapFormat = new SoapFormatter();//创建SOAP序列化器

            soapFormat.Serialize(fStream, p);//SOAP不能序列化泛型对象

            //使用SOAP反序列化对象

            fStream.Position = 0;//重置流位置

            p = null;

            p = (Programmer)soapFormat.Deserialize(fStream);

            Console.WriteLine(p);

            Console.Read();

        }

        [Serializable //必须添加序列化特性

        public class Person

        {

            private string Name;//姓名

            private bool Sex;//性别,是否是男

            public Person(string name, bool sex)

            {

                this.Name = name;

                this.Sex = sex;

            }

            public override string ToString()

            {

                return "姓名:" + this.Name + "\t性别:" + (this.Sex ? "男" : "女");

            }

        }

        [Serializable //必须添加序列化特性

        public class Programmer : Person

        {

            private string Language;//编程语言

            public Programmer(string name, bool sex, string language)

                : base(name, sex)

            {

                this.Language = language;

            }

            public override string ToString()

            {

                return base.ToString() + "\t编程语言:" + this.Language;

            }

        }

    }

}

 

效果

 

使用XML方式的序列化和反序列化

 

 

  public class Person
    {
        public string Name;//姓名
        public bool Sex;//性别,是否是男
        public Person() { }//必须提供无参构造器,否则XmlSerializer将出错
        public Person(string name, bool sex)
        {
            this.Name = name;
            this.Sex = sex;
        }
        public override string ToString()
        {
            return "姓名:" + this.Name + "\t性别:" + (this.Sex ? "男" : "女");
        }
    }
    public class Programmer : Person
    {
        public string Language;//编程语言
        public Programmer() { }//必须提供无参构造器,否则XmlSerializer将出错
        public Programmer(string name, bool sex, string language) : base(name, sex)
        {
            this.Language = language;
        }
        public override string ToString()
        {
            return base.ToString() + "\t编程语言:" + this.Language;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            //创建Programmer列表,并添加对象
            List<Programmer> list = new List<Programmer>();
            list.Add(new Programmer("李志伟", true, "C#"));
            list.Add(new Programmer("Coder2", false, "C++"));
            list.Add(new Programmer("Coder3", true, "Java"));
            //使用XML序列化对象
            string fileName = @"D:\users\lizw\桌面\Programmers.xml";//文件名称与路径
            Stream fStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite);
            XmlSerializer xmlFormat = new XmlSerializer(
typeof(List<Programmer>),
new Type[] { typeof(Programmer),typeof(Person) }
);//创建XML序列化器,需要指定对象的类型
            xmlFormat.Serialize(fStream, list);
            //使用XML反序列化对象
            fStream.Position = 0;//重置流位置
            list.Clear();
            list = (List<Programmer>)xmlFormat.Deserialize(fStream);
            foreach (Programmer p in list)
            {
                Console.WriteLine(p);
            }
            Console.Read();
        }
    }

 

未能改正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值