C#序列化和反序列化

定义:序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是在适当的时候把这个文件再转化成原来的对象使用。
作用:1、在进程下次启动时读取上次保存的对象的信息 
         2、在不同的AppDomain或进程之间传递数据  
         3、在分布式应用系统中传递数据

实现方法:BinaryFormatter、SoapFormatter、XML序列化

一、BinaryFormatter
主要就是调用System.Runtime.Serialization.Formatters.Binary空间下的BinaryFormatter类进行序列化和反序列化,以缩略型二进制格式写到一个文件中去,速度比较快,而且写入后的文件已二进制保存有一定的保密效果。

二、SoapFormatter序列化方式

主要就是调用System.Runtime.Serialization.Formatters.Soap空间下的SoapFormatter类进行序列化和反序列化,使用之前需要应用System.Runtime.Serialization.Formatters.Soap.dll(.net自带的)
序列化之后的文件是Soap格式的文件(简单对象访问协议(Simple Object Access Protocol,SOAP),是一种轻 量的、简单的、基于XML的协议,它被设计成在WEB上交换结构化的和固化的信息。 SOAP 可以和现存的许多因特网协议和格式结合使用,包括超文本传 输协议(HTTP),简单邮件传输协议(SMTP),多用途网际邮件扩充协议(MIME)。它还支持从消息系统到远程过程调用(RPC)等大量的应用程 序。SOAP使用基于XML的数据结构和超文本传输协议(HTTP)的组合定义了一个标准的方法来使用Internet上各种不同操作环境中的分布式对象。)

三、XML序列化方式

主要就是调用System.Xml.Serialization 空间下的XmlSerializer类进行序列化和反序列化

 

using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization.Formatters.Soap; //使用之前需要应用System.Runtime.Serialization.Formatters.Soap.dll(.net自带的)
using System.Xml.Serialization;

namespace MySerializeDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            MyObject obj = new MyObject();  
            obj.Birthday = new DateTime(1979, 11, 7);  
            obj.HomePlace = "湖北";  
            obj.Name = "周公";

            Console.WriteLine("========使用BinaryFormatter类进行序列化和反序列化。====");  
            BinarySerialize(obj);  
            BinaryDeserialize(@"C:/MyObject.dat");

            Console.WriteLine("========使用SoapFormatter类进行序列化和反序列化。====");
            SoapSerialize(obj);
            SoapDeserialize(@"C:/MyObject.soap");

            Console.WriteLine("========使用XmlSerializer类进行序列化和反序列化。====");
            XMLSerialize(obj);
            XMLDeserialize(@"C:/MyObject.xml");
 
            Console.ReadLine();
        }

        
        public static void BinarySerialize(MyObject obj)  
        {  
            using (FileStream stream = new FileStream(@"C:/MyObject.dat", FileMode.Create, FileAccess.Write))  
            {  
                BinaryFormatter formater = new BinaryFormatter();  
                formater.Serialize(stream, obj);  
                Console.WriteLine("对象已经被序列化。" + obj.ToString());  
            }  
        } 
        public static void BinaryDeserialize(string fileName)  
        {  
            using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read))  
            {  
                BinaryFormatter formater = new BinaryFormatter();  
                MyObject obj=(MyObject)formater.Deserialize(stream);  
                Console.WriteLine("对象已经被反序列化。" + obj.ToString());  
            }  
        }

        public static void SoapSerialize(MyObject obj) {
            using (FileStream stream = new FileStream(@"C:/MyObject.soap", FileMode.Create, FileAccess.Write)) {
                SoapFormatter formater = new SoapFormatter();
                formater.Serialize(stream, obj);
                Console.WriteLine("对象已经被序列化。" + obj.ToString());  
            }
        }
        public static void SoapDeserialize(string fileName) {
            using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
            {
                SoapFormatter formater = new SoapFormatter();
                MyObject obj = (MyObject)formater.Deserialize(stream);
                Console.WriteLine("对象已经被反序列化。" + obj.ToString());
            }  
        }

        public static void XMLSerialize(MyObject obj) {
            using (FileStream stream = new FileStream(@"C:/MyObject.xml", FileMode.Create, FileAccess.Write)) {
                XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
                serializer.Serialize(stream,obj);
                Console.WriteLine("对象已经被序列化。" + obj.ToString());
            }
        }
        public static void XMLDeserialize(string fileName) {
            using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read)) {
                XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
                MyObject obj = (MyObject)serializer.Deserialize(stream);
                Console.WriteLine("对象已经被反序列化。" + obj.ToString());  
            }
        }
    }

    //用XML序列化时可以不加下面的标示
    [Serializable]
    public class MyObject {
        private string name;
        private DateTime birthday;
        private string homePlace;

        public string Name {
            get { return name; }
            set { name = value; }
        }
        public DateTime Birthday {
            get { return birthday; }
            set { birthday = value; }
        }
        public string HomePlace {
            get { return homePlace; }
            set { homePlace = value; }
        }
       
        public int Age {
            get { return DateTime.Now.Year - birthday.Year; }
        }

        public override string ToString()
        {
            return string.Format("姓名:{0},生日:{1},出生地:{2},年龄:{3}", name, birthday, homePlace, Age);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值