c#中的二进制序列化

本文通过实例演示了如何在C#中使用二进制格式进行对象的序列化和反序列化,包括创建对象、序列化到文件、从文件中读取并反序列化对象的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

c#中的序列化与反序列化

 直接上代码:

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.Serialization;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace SerilizeLearn002
{
    //二进制序列化
    [Serializable]
    public class Person
    {
        private string _name;
        private bool _sex;

        public Person(string name, bool sex)
        {
            this._name = name;
            this._sex = sex;
        }

        public override string ToString()
        {
            return "姓名:" + this._name + "性别:" + (this._sex ? "" : "");
        }

    }
    [Serializable]
    public class Programmer : Person
    {
        private string _language;
        public Programmer(string name, bool sex, string language)
            : base(name, sex)
        {
            this._language = language;
        }

        public override string ToString()
        {
            return base.ToString() + "编程语言:" + this._language;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
          //创建programer 列表;
            List<Programmer> list = new List<Programmer>();
            list.Add(new Programmer("jack",true,"c#"));
            list.Add(new Programmer("tom",true,"c++"));
            list.Add(new Programmer("frank",true,"java"));

            //使用二进制序列化对象;
            string fileName = @"d:\Programmer.dat";
            Stream fsStream = new FileStream(fileName,FileMode.Create,FileAccess.ReadWrite);
            BinaryFormatter binFormat = new BinaryFormatter(); //二进制序列化器;
            binFormat.Serialize(fsStream,list);
            
            //然后我们再把他给反序列化出来滴呀; 
            list.Clear(); //清空列表信息滴呀;
            fsStream.Position = 0; //重置流位置;

            list = (List<Programmer>)binFormat.Deserialize(fsStream);
            foreach (Programmer p in list)
            {
                Console.WriteLine(p);
            }
            fsStream.Close(); //释放非托管资源;
            Console.ReadLine();
        }
    }
}

 

打开文件(记事本)虽然出现了乱码,单我们还是能够看到,序列化之后,它保存了版本等信息。

 

总结:

使用二进制序列化,必须为每一个要序列化的的类和其关联的类加上[Serializable]特性,对类中不需要序列化的成员可以使用[NonSerialized]特性。

二进制序列化对象时,能序列化类的所有成员(包括私有的),且不需要类有无参数的构造方法。

使用二进制格式序列化时,它不仅是将对象的字段数据进行持久化,也持久化每个类型的完全限定名称和定义程序集的完整名称(包括包称、版本、公钥标记、区域性),这些数据使得在进行二进制格式反序列化时亦会进行类型检查。

所以反序列化时的运行环境要与序列化时的运行环境要相同,否者可能会无法反序列化成功。(只是可能)

 

转载于:https://www.cnblogs.com/mc67/p/5083222.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值