编程语言
首页 > 编程语言> > C# 使用BinaryFormatter序列化对象

C# 使用BinaryFormatter序列化对象

作者:互联网

使用BinaryFormatter二进制类型。再次注意BinaryFormatter类型的两个关键方法:Serialize()和Deserialize()。
下面是Serialize()和Deserialize()介绍:
Serialize():将一个对象图按字节的顺序持久化到一个指定的流。
Deserialize():将一个持久化的字节顺序转化为一个对象图。
假设已经建立了JamesBondCar的一个实例,修改了一些状态数据,并想将间谍汽车(JamesBondCar)持久化到一个*.dat文件中。第一个任务是建立*.dat文件本身。这可以通过建立一个System.IO.FileStream类型的实例来完成。此刻,仅仅建立一个BinaryFormatter的实例并传进FileStream和对象图进行持久化。
在控制台应用程序,Main()函数的写法

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 JamesBondCarCS
{
    class Program
    {

        // 确保使用了SystemRuntime.Serialzation.Formatters.Binary
        // 和System.IO命名空间
        static void Main(string[] args)
        {
            Console.WriteLine("***** Fun with object Serialization *****\n");

            // 建立一个JamesBondCar并设定状态
            JamesBondCar jbc = new JamesBondCar();
            jbc.canFly = true;
            jbc.canSubmerage = false;
            jbc.theRadio.stationPresets = new double[] { 89.3, 105.1, 97.1 };
            jbc.theRadio.hasSubWoofers = true;

            // 将car以二进制格式保存到指定文件中
            SaveAsBinaryFormat(jbc, "CarData.dat");
            Console.ReadLine();
        }
        static void SaveAsBinaryFormat(object objGraph, string fileName)
        {
            // 将对象以二进制保存到一个名为CarData.Dat的文件
            BinaryFormatter binFormat = new BinaryFormatter();

            using (Stream fStream = new FileStream(fileName,
                   FileMode.Create, FileAccess.Write, FileShare.None))
            {
                binFormat.Serialize(fStream, objGraph);
            }
            Console.WriteLine("=> Saved Car in binary format!");
        }
    }
}

JamesBondCar实例类的实现:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace JamesBondCarCS
{
    [Serializable]
    public class JamesBondCar: Car
    {
        public bool canFly;
        public bool canSubmerage;
    }
}

JamesBondCar是继承Car的成员字段和成员函数,Car类的实现

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace JamesBondCarCS
{
    [Serializable]
    public class Car
    {
        public Radio theRadio = new Radio();
        public bool isHatchBack;
    }
}

与此同时还要创建一个Radio的类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace JamesBondCarCS
{
    [Serializable]
    public class Radio
    {
        public bool hasTweeters;
        public bool hasSubWoofers;
        public double[] stationPresets;

        [NonSerialized]
        public string radioID = "XF-553RR6";
    }
}

BinaryFormatter.Serialize()方法是一个负责生成对象图并将字节顺序移动到流的派生类型的成员。在这个例子中,流碰巧是一个物理文件,而然,也可以序列化对象类型为任意流的派生类型,例如放置到内存,网络流中。
在运行程序之后,我们就可以转到当前项目\bin\Debug文件夹查看表示JamesBondCar实例的CarData.dat文件的内容了,使用Visual Studio中打开的这个文件
在这里插入图片描述
小结:支持BinaryFormatter序列化的类必须添加SerializableAttribute,即便是其基类也支持BinaryFormatter序列化,BinaryFormatter序列化基于对象的动态类型。

标签:C#,System,BinaryFormatter,jbc,using,序列化,public,JamesBondCar
来源: https://blog.csdn.net/weixin_44548643/article/details/95043006