zoukankan      html  css  js  c++  java
  • C#序列化与反序列化。

    序列化介绍:

    把对象用一种新的格式来表示。

    系列化只序列化数据。

    序列化不建议使用自动属性

    为什么要序列化:

    将一个复杂的对象转换流,方便存储与信息交换。

    class Program
        {      
            static void Main(string[] args)
            {
                Person person = new Person();
                person.Name = "张三";
                person.Age = 18;
                // json 序列化   变成字符串
                JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
                string msg = javaScriptSerializer.Serialize(person);
                Console.WriteLine(msg);
            }    
        }
        class Person
        {
            public string Name { get; set; }
            public  int Age { get; set; }
        }

    二进制序列化:

    就是将对象变成流的过程,把对象变成byte[ ]。

    class Program
        {      
            static void Main(string[] args)
            {
                Person person = new Person();
                person.Name = "张三";
                person.Age = 18;
                // 二进制序列化注意点:
                //1、被序列化对象类型必须标记为可序列化
                //2、被序列化的所有父类也必须标记为可序列化
                //3、被序列化的对象的类型中字段的类型也要标记
    
                //二进制序列化步骤:
                //1、创建序列化器
                BinaryFormatter bf = new BinaryFormatter();
                // 1.1 创建一个文件流。
                using(FileStream fsWrite =new FileStream("person.bin", FileMode.Create))
                {
                    //2、开始执行序列化。
                    bf.Serialize(fsWrite, person);
                }
                Console.WriteLine("序列化完毕");
                
            }    
        }
        [Serializable]
        class Person:Animal
        {
            public string Name { get; set; }
            public  int Age { get; set; }
            public Car BenChi { get; set; }
        }
        [Serializable]
        public class Animal
        {
            public  void Eat()
            {
                Console.WriteLine("eat food...");
            }
        }
        [Serializable]
        public class Car
        {
    
        }

    反序列化:

     class Program
        {      
            static void Main(string[] args)
            {
                 //二进制反序列化注意的问题:
                 //1、必须获取被系列化的对象的类型所在的程序集。因为它要根据序列化文件还原该对象,而序列化文件中
                 //只包含数据信息,而不包含其类型的相关信息、方法相关信息等,这些信息在对象序列文件中都没有。
    
                //步骤:
                //1、创建序列化器。
                BinaryFormatter bf = new BinaryFormatter();
                //1.1 创建读取文件的文件流。
                using(FileStream fsRead=new FileStream("person.bin", FileMode.Open))
                {
                    //2、执行反序列化。
                    object obj = bf.Deserialize(fsRead);
                    Person person = (Person)obj;
                    Console.WriteLine(person.Name);
                }
                Console.WriteLine("ok");
                 
                
            }    
        }
        [Serializable]
        class Person
        {
            public string Name { get; set; }
            public  int Age { get; set; }
        }

     练习:添加对象到array list中,进行序列化和反序列化。

    序列化:

    class Program
        {      
            static void Main(string[] args)
            {
                ArrayList arrayList = new ArrayList();
                arrayList.Add("张三");
                arrayList.Add(18);
                //创建序列化容器
                BinaryFormatter bf = new BinaryFormatter();
                //创建文件流
                using(FileStream fs=new FileStream("txt.txt", FileMode.Create))
                {
                    //执行序列化
                    bf.Serialize(fs, arrayList);
                }
                Console.WriteLine("序列化完毕");
                
            }    
        }

    反序列化:

    class Program
        {      
            static void Main(string[] args)
            {
                //创建序列化容器
                BinaryFormatter bf = new BinaryFormatter();
                //创建读取的文件流
                using(FileStream fs=new FileStream("txt.txt", FileMode.Open))
                {
                    //执行反序列化
                   object obj= bf.Deserialize(fs);
                    ArrayList arrayList = (ArrayList)obj;
                    foreach (var item in arrayList)
                    {
                        Console.WriteLine(item);
                    }
                }
               
                
            }    
        }
  • 相关阅读:
    [Trie][并查集]JZOJ 5822 量子纠缠
    [模拟]JZOJ 5820 非法输入
    SAM模板
    [树形DP]JZOJ 5819 大逃杀
    [MST][dij]JZOJ 5818 做运动
    [暴力]JZOJ 5817 抄代码
    [概率期望][树形DP][LCA]JZOJ 5814 树
    认证组件
    注册接口
    视图家族 & 路由组件
  • 原文地址:https://www.cnblogs.com/zhangyuhao/p/10540989.html
Copyright © 2011-2022 走看看