C#序列化和反序列化

.net下有一种技术叫做对象序列化,说得通俗一点,序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是在需要的时候再把这个文件转化成原来的对象使用。
在.NET中常见的序列化的方法主要也有三个:二进制序列化、XML序列化、SOAP序列化。
下面通过一个小例子来说明这三种方法的使用。
using System;
using System.Collections.Generic;
using System.Text;

namespace FileSerializer
{
    [Serializable]
    public class Book
    {     
        string id;
        string name;

        public string Id
        {
            get { return id; }
            set { id = value; }
        }

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
       
        public Book()
        {
        }

        public Book(string id,string name)
        {
            this.id = id;
            this.name = name;
        }

        public override string ToString()
        {
            return "编号:" + id + "\t名称:" + name;
        }
    }
}

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Xml.Serialization;

namespace FileSerializer
{
    public abstract class Serializer<T>
    {
        string filePath;

        public string FilePath
        {
            get { return filePath; }
            set { filePath = value; }
        }

        public Serializer(string filePath)
        {
            this.filePath = filePath;
        }

        public void Serialize(T serializeObj)
        {
            using (Stream st = new FileStream(filePath, FileMode.Create, FileAccess.Write))
            {
                S(st, serializeObj);
            }
        }

        protected abstract void S(Stream st, T serializeObj);

        public T Deserialize()
        {
            using (Stream st = new FileStream(filePath, FileMode.Open, FileAccess.Read))
            {
                return D(st);
            }
        }

        protected abstract T D(Stream st);
    }
}

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

namespace FileSerializer
{
    class SerializerBinary<T> : Serializer<T>
    {
        public SerializerBinary(string filePath)
            : base(filePath)
        {
        }
        protected override void S(Stream st, T serializeObj)
        {
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(st, serializeObj);
        }

        protected override T D(Stream st)
        {
            BinaryFormatter bf = new BinaryFormatter();
            return (T)bf.Deserialize(st);
        }
    }
}

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters.Soap;

namespace FileSerializer
{
    public class SerializerSoap<T> : Serializer<T>
    {
        public SerializerSoap(string filePath)
            : base(filePath)
        {
        }

        protected override void S(Stream st, T serializeObj)
        {
            SoapFormatter sf = new SoapFormatter();
            sf.Serialize(st, serializeObj);
        }

        protected override T D(Stream st)
        {
            SoapFormatter sf = new SoapFormatter();
            return (T)sf.Deserialize(st);
        }
    }
}
 

using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization;
using System.IO;

namespace FileSerializer
{
    public class SerializerXml<T> : Serializer<T>
    {
        public SerializerXml(string filePath)
            : base(filePath)
        {
        }

        protected override void S(Stream st, T serializeObj)
        {
            XmlSerializer xs = new XmlSerializer(typeof(T));
            xs.Serialize(st, serializeObj);
        }

        protected override T D(Stream st)
        {
            XmlSerializer xs = new XmlSerializer(typeof(T));
            return (T)xs.Deserialize(st);
        }
    }
}
 

using System;
using System.Collections.Generic;
using System.Text;

namespace FileSerializer
{
    class Program
    {
        static void Main(string[] args)
        {
            Book book = new Book("01","C#程序设计入门01");
            Serializer<Book> serializer = new SerializerBinary<Book>("bookBinary");
            serializer.Serialize(book);

            Book newbook = serializer.Deserialize();
            Console.WriteLine(newbook.ToString());
  
            book = new Book("02", "C#程序设计入门02");
            serializer = new SerializerSoap<Book>("bookSoap.soap");
            serializer.Serialize(book);

            newbook = serializer.Deserialize();
            Console.WriteLine(newbook.ToString());

            book = new Book("03", "C#程序设计入门03");
            serializer = new SerializerXml<Book>("bookXml.xml");
            serializer.Serialize(book);

            newbook = serializer.Deserialize();
            Console.WriteLine(newbook.ToString());
            Console.ReadLine();
        }
    }
}

posted @ 2014-05-24 12:49  zzg168  阅读(119)  评论(0)    收藏  举报