• c#序列化


    xml序列化;javascript序列化;二进制序列化

    序列化,就是把一个对象转换成另外一种格式的过程,转换成不同的格式就叫做不同的序列化,比如xml格式,叫做xml序列化。JavaScript的json格式,叫做JavaScript序列化。转换成二进制byte[]字节,叫做二进制序列化。

    序列化只序列化对象属性(或者说是序列化了对象中的状态信息(字段、属性就是用来存储状态的)),而方法并没有序列化。

    序列化后的目的,是为了把数据以另外一种格式来表示,方便存储与交换数据,所以序列化只序列化那些存储数据的成员,一般就是属性,不会序列化方法的。

    1、二进制序列化 (利用BinaryFormatter类)

    //二进制序列化 (必须添加 [Serializable]特性用于标记。object,int等类型都已经添加此特性了)

    List list = new List() { "上海", "中国", "西安" };
    BinaryFormatter bf = new BinaryFormatter();
    using (FileStream fsWrite = File.OpenWrite("list.bin")) 
    {
     bf.Serialize(fsWrite, list);//将list对象序列化到文件流中
     //bf.Deserialize();//反序列化
    }
    

      

     //二进制序列化要求:

    //1.被序列化的对象的类型必须标记为可序列化的。
    //2.二进制序列化会把属性对应的字段序列化到文件中,所以最好类型中不要使用自动属性(编译器会自动生成字段),而要自己写属性与字段
    //3.当序列化一个对象的时候,这个对象本身以及所有父类都必须标记为可序列化的。
    //4.类型中所有属性与字段的类型必须也标记为可序列化的。接口不需要。
    //5.通过[NonSerialized]把某个字段标记为不可序列化的。

    //二进制反序列化(必须添加对象类型的引用)

    //反序列化的时候,需要创建原来被序列化的类型的对象,所以反序列化的时候需要引用被序列化的类型的对象。正是因为如此,所以在二进制序列化的时候,那些属性名、方法等根本不需要序列化,只需要把那些状态信息(数据→字段的值)序列化了就好了,对于那些方法等信息,在反序列化时,创建对象的时候会自动创建,然后根据序列化文件中的字段的值,进行赋值。这就是反序列化。

    BinaryFormatter bf = new BinaryFormatter();
    using (FileStream fsRead = File.OpenRead("words.bin"))
    {
    object obj = bf.Deserialize(fsRead);
    List<string> list = obj as List<string>;
    foreach (var item in list)
    {
    Console.WriteLine(item);
    }
    }
    

    2、xml序列化 (xmlSerializer)

    XmlSerializer xmlSerializer = new XmlSerializer(list.GetType());
    XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Person>));
    using (FileStream fsWrite = File.OpenWrite("list.xml"))
    {
    xmlSerializer.Serialize(fsWrite, list);
     //xmlSerializer.Deserialize();//反序列化
    }
    

    3、使用JavaScript 序列化。(JavaScriptSerializer )

    JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
    string str = jsSerializer.Serialize(list);
    //jsSerializer.Deserialize();//反序列化
    File.WriteAllText("list.txt", str);
    

    补充:二进制序列化例子

                Person person = new Person();
                person.Name = "张三";
                person.Age = 19;
                person.Email = "zhangsan@yahoo.com";
                person.MyCar = new Car() { Brand = "时风" };
    
                //二进制序列化步骤:
                //1.创建二进制序列化器
                BinaryFormatter bf = new BinaryFormatter();
                //我们希望将对象序列化到一个文件上,所以要创建一个文件流
                using (FileStream fsWrite = File.OpenWrite("person.bin"))
                {
                    //开始执行二进制序列化
                    bf.Serialize(fsWrite, person);
                }
                Console.WriteLine("序列化完毕!");
                Console.ReadKey();
    

      自定义类

        [Serializable]
        public class Car
        {
            private string _brand;
            public string Brand
            {
                get { return _brand; }
                set { _brand = value; }
            }
        }
        [Serializable]
        public class Animal
        {
        }
        [Serializable] //特性,当为某个类加了该特性后,这个类就标记为了可序列化的了。
        public class Person : Animal
        {
            private Car _myCar;
            public Car MyCar
            {
                get { return _myCar; }
                set { _myCar = value; }
            }
            //[NonSerialized]//当前这个字段就不会被序列化了。
            private string _name;
            public string Name
            {
                get { return _name; }
                set { _name = value; }
            }
            //[NonSerialized]
            private int _age;
            public int Age
            {
                get { return _age; }
                set { _age = value; }
            }
            //[NonSerialized]
            private string _email;
            public string Email
            {
                get { return _email; }
                set { _email = value; }
            }
            private string _gender = "男";
            public int _height = 180;
            public void SayHi()
            {
                Console.WriteLine("大家好,我叫:{0}", Name);
            }
            public void SayHello()
            {
                Console.WriteLine("Hello");
            }
        }
    

      

  • 相关阅读:
    启动ABP项目异常 :could not instantiate Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionDescriptorProvider
    日志体系
    高并发架构
    分布式接口幂等性、分布式限流:Guava 、nginx和lua限流
    MQ实现分布式事物处理说明比较
    循环依赖
    Redis 6 中的多线程
    BigDecimal
    paper
    什么是自旋锁
  • 原文地址:https://www.cnblogs.com/crhdyl/p/4910354.html
Copyright © 2020-2023  润新知