• C# 序列化与反序列化意义详解 Jack


    总结:

    ①序列化基本是指把一个对象保存到文件或流中,比如可以把文件序列化以保存到Xml中,或一个磁盘文件中

    ②序列化以某种存储形式使自定义对象持久化;
    ③将对象从一个地方传递到另一个地方。

    ④将类的值转化为一个一般的(即连续的)字节流,然后就可以将该流写到磁盘文件或任何其他流化目标上。

    ⑥序列是指将对象的实例状态存储到存储媒体的过程。
    在此过程中,先将对象的公共字段以及类的名称(包括类的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。

    ⑦用处非常大,用于数据传输,对象存贮等。

    这些是我通过网上多方参考再结合自己的经验总结的。还是看实例。

     

    using System;
    using System.IO; //文件操作相关
    using System.Runtime.Serialization.Formatters.Binary; //包含 BinaryFormatter 类,该类可用于
    
    以二进制格式将对象序列化和反序列化。
    
    namespace SerializeDeserialize
    {
        class Program
        {
            static void Main(string[] args)
            {
                Program P = new Program();
                P.SerializeStudent();
                P.DeSerializeStudent();
            }
            public void SerializeStudent()
            {
                Student c = new Student();
                c.Id = 0;
                c.Name = "liang";
                c.Sex = "女";
                c.Qq = "676596050";
                c.Homepage = "http://www.zrrj.net";
                //创建二进制文件temp.dat
                FileStream fileStream = new FileStream("c:\\temp.dat", FileMode.Create);
                BinaryFormatter b = new BinaryFormatter();
    
                //将Student实例对象序列化给fileStream流:其含义是这时候的Student对象已经存储到
    
    temp.dat 文件中
                b.Serialize(fileStream, c);
                fileStream.Flush();
                fileStream.Close();
                fileStream.Dispose();
            }
            public void DeSerializeStudent()
            {
    
                Student c = new Student();
                //下面三个属性输出时没有更改,因为反序列化实例化了一个新的Student
                c.Id = 1;
                c.Qq = "676596051";
                c.Homepage = "http://www.zrrj.net";
                FileStream fileStream = new FileStream("c:\\temp.dat", FileMode.Open, 
    
    FileAccess.Read, FileShare.ReadWrite);
                BinaryFormatter b = new BinaryFormatter();
                //将temp.dat 的文件流反序列化为Student
                c = b.Deserialize(fileStream) as Student;
                c.Name = "liang";
                c.Sex = "男";
                Console.Write("编号:" + c.Id + "\n姓名:" + c.Name + "\n性别:" + c.Sex + "\nQQ:" 
    
    + c.Qq + "\n主页:" + c.Homepage);
                Console.ReadLine();
                //释放文件流资源
                fileStream.Flush();
                fileStream.Close();
                fileStream.Dispose();
            }
    
    
            /// <summary>
            /// 创建6个可读可写的属性
            /// </summary>
            [Serializable]
            public class Student
            {
                //编号
                private int id;
                //姓名
                private string name;
                //性别
                private string sex;
                //QQ
                private string qq;
                //主页
                private string homepage;
    
    
                public int Id
                {
                    get { return id; }
                    set { id = value; }
                }
                public string Name
                {
                    get { return name; }
                    set { name = value; }
                }
                public string Sex
                {
                    get { return sex; }
                    set { sex = value; }
                }
                public string Qq
                {
                    get { return qq; }
                    set { qq = value; }
                }
                public string Homepage
                {
                    get { return homepage; }
                    set { homepage = value; }
                }
    
            }
    
    
        }
    }
    
    上面的序列化会将Student类实例存储到temp.dat 文件中,相反的反序列化就会实现将temp.dat中的数
    
    据反向生成Student对象
    
    方便理解,其中在本实例中C:\temp.dat内容是:
    
                 KSerializeDeserialize, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null   
    
     $SerializeDeserialize.Program+Student    id name sex qq           灏忔睙    濂?    
    
    676596050
    
    可以看出已经转换为了二进制编码。
    
    
    using System;
    
    using System.Collections; //HashTable 所在的命名空间
    using System.IO;           //FileStream所在的命名空间
    using System.Runtime.Serialization.Formatters.Binary; //序列化反序列化进制转换空间
    
    namespace Same1
    {
        class Program
        {
            static void Main(string[] args)
            {
                Serialize();
                Deserialize();
                Console.ReadLine();
            }
            static void Serialize()
            {
                //创建一个包含值的HashTable最后将被序列化
                Hashtable addresses = new Hashtable();
                addresses.Add("Jeff", "123 Main Street, Redmond, WA 98052");
                addresses.Add("Fred", "987 Pine Road, Phila., PA 19116");
                addresses.Add("Mary", "PO Box 112233, Palo Alto, CA 94301");
                //为了将HashTable序列化,需要创建一个File Stream
                FileStream fs = new FileStream("DataFile.dat", FileMode.Create);
                // 利用二进制格式化将 Hashtable序列化至文件流中
                BinaryFormatter formatter = new BinaryFormatter();
                try
                {
                    formatter.Serialize(fs, addresses);
                }
                catch (System.Runtime.Serialization.SerializationException e)
                {
                    Console.WriteLine("序列化失败原因是: " + e.Message);
                    throw;
                }
                finally
                {
                    fs.Flush();
                    fs.Close();
                    fs.Dispose();
                }
            }
            static void Deserialize()
            {
                // 声明一个HashTable
                Hashtable addresses = null;
                // 打开你需要反序列化的文件,并以流的形式输出
                FileStream fs = new FileStream("DataFile.dat", FileMode.Open);
                try
                {
                    BinaryFormatter formatter = new BinaryFormatter();
                    //反序列化文件流为HashTable
                    addresses = (Hashtable)formatter.Deserialize(fs);
                }
                catch (System.Runtime.Serialization.SerializationException e)
                {
                    Console.WriteLine("反序列化失败,原因是: " + e.Message);
                    throw;
                }
                finally
                {
                    fs.Flush();
                    fs.Close();
                    fs.Dispose();
                }
                //为了验证反序列化是否成功,将HashTale中的键、值对输出
                foreach (DictionaryEntry de in addresses)
                {
                    Console.WriteLine("{0} 的出生地是: {1}.", de.Key, de.Value);
                }
            }
        }
    }
    
    DateFile.dat 内容是:
    
                 System.Collections.Hashtable    
    LoadFactor Version Comparer HashCodeProvider HashSize Keys Values 
    
    System.Collections.IComparer$System.Collections.IHashCodeProvider 霶8?    
    
                      Mary    Jeff    Fred          "PO Box 112233, Palo Alto, CA 94301    "123 
    
    Main Street, Redmond, WA 98052     987 Pine Road, Phila., PA 19116 
    
    

      

  • 相关阅读:
    如何在ubuntu里面使用JNI?
    sql server 关键字一
    自己编写的 objectDataSource 配合 GridView 实现分页...
    委托和匿名委托的比较
    实现 IEnumerable IEnumator 接口的类,可直接用作 Gridivew 的数据源
    ASP.NET 中的页面事件执行顺序
    泛型,集合的根本区别
    匿名委托的示例,贴一下以供参考...
    ajax "Sys 未定义" 的问题解决方法
    抽象工厂模式(C#)
  • 原文地址:https://www.cnblogs.com/liangdejiu/p/2591437.html
Copyright © 2020-2023  润新知