C#利用BinaryFormatter序列化对象的用法

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

总结:

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

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

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

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

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

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

using System;
using System.Collections.Generic;
using System.IO;    //文件操作相关
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;   //包含 BinaryFormatter类,该类可用于以二进制格式将对象序列化和反序列化。
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    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; }
            }
        }
    }
}

 

下面是序列化Hashtable的示例代码:

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);
            }
        }
    }
}

参考链接(转载至):https://www.cnblogs.com/liangdejiu/archive/2012/07/14/2591437.html

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C# 中,要对对象进行序列化,你需要遵循以下步骤: 1. 导入 `System.Runtime.Serialization` 命名空间。 2. 在要序列化的类上添加 `[Serializable]` 特性。 3. 创建一个 `FileStream` 对象,用于将序列化对象写入文件或流。 4. 创建一个 `BinaryFormatter` 对象,用于执行序列化操作。 5. 使用 `BinaryFormatter.Serialize` 方法将对象序列化并写入文件或流。 6. 关闭 `FileStream` 对象。 下面是一个简单的示例代码,演示了如何对一个名为 `Person` 的类进行序列化: ```csharp using System; using System.IO; using System.Runtime.Serialization.Formatters.Binary; [Serializable] public class Person { public string Name { get; set; } public int Age { get; set; } } public class SerializationExample { public static void Main() { Person person = new Person { Name = "John", Age = 30 }; // 序列化 FileStream fileStream = new FileStream("person.dat", FileMode.Create); BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(fileStream, person); fileStream.Close(); // 反序列化 FileStream fileStream2 = new FileStream("person.dat", FileMode.Open); Person deserializedPerson = (Person)formatter.Deserialize(fileStream2); fileStream2.Close(); Console.WriteLine($"Name: {deserializedPerson.Name}, Age: {deserializedPerson.Age}"); } } ``` 在上述示例中,我们首先创建了一个 `Person` 类,并使用 `[Serializable]` 特性标记它以进行序列化。然后,我们在 `SerializationExample` 类的 `Main` 方法中,创建了一个 `Person` 对象并将其序列化到名为 "person.dat" 的文件中。接着,我们再次打开文件并将其反序列化为一个新的 `Person` 对象,最后输出其属性值。 请注意,如果你的类包含了不可序列化的成员(例如事件、委托等),你需要将其标记为 `[NonSerialized]` 或使用其他方式进行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值