zoukankan      html  css  js  c++  java
  • c#中的二进制序列化

    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]特性。

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

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

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

  • 相关阅读:
    前端基础知识1
    mysql作业
    mysql了解知识点
    mysql3
    数据库作业2
    循环结构经典题型
    计算1
    猜数字游戏
    css的显示
    定位和position定位
  • 原文地址:https://www.cnblogs.com/mc67/p/5083222.html
Copyright © 2011-2022 走看看