序列化之二进制与JSON

时间:2025-03-28 13:35:04

1.什么是序列化

我们把变量从内存中变成可存储或传输的过程称之为序列化

2.为什么要序列化

根本原因:需要将变量或对象从内存中取出来进行存储或传输

3.具体应用:

1)对象保存到文件或数据库

2)网络编程时对象跨平台跨语言传输,也即从windows上序列化的对象可到linux上返序列化,用c#序列化的对象可以被java反序列化。

4.序列化的形式:

1)二进制序列化器BinaryFormatter,主要将对象序列化成流的形式,用于数据存储

2)JSON序列化器,主要将对象序列化成字符串,用于数据传输

5.主要区别:

1)二进制序列化器需要向需要序列化的类应用[Serializable]特性,而Json序列化器不需要

2)二进制序列化器只能序列化字段,而不能序列化属性,也就是说当一个类中不显示定义字段,二进制序列化器是不起作用的,JSON序列化器没有这条规定。在二进制序列化器中,若某个字段不需要序列化,可向其应用[NonSerialized]特性,以节省网络传输的带宽以及减少序列化后文件大小

3)二进制序列化后得到的是一个二进制文件,而JSON序列化后得到的是JSON字符串。

字符串有三种形式,分别是:

a.对象

           一个没有顺序的“键/值”,一个对象以花括号“{”开始,并以花括号"}"结束

           在每一个“键”的后面,有一个冒号,并且使用逗号来分隔多个键值对。

var user = {"name":"Acettest","gender":"Male","birthday":"1987-8-8"}   

        b.数组

           设置值的顺序,一个数组以中括号”["开始,并以中括号"]"结束,并且所有的值使用逗号分隔.

var userlist = [                                         
                  {"user":{"name":"Acettest","gender":"Male","birthday":"1987-8-8"}}, 
                  {"user":{"name":"msheng","Male":"Female","birthday":"1987-7-7"}}
                ]

        c.字符串

            任意数量的Unicode字符,使用引号做标记,并使用反斜杠来分隔。

            (注意: 引号  逗号  冒号  均为英文状态下半角符号, 且只能是双引号 )

var userlist = "{\"ID\":1,\"Name\":\"Manas\",\"Address\":\"India\"}" 

7.使用:

1)二进制序列化

a.二进制序列化器


    [Serializable]
    internal class Book
    {
        private string name;
        public string Name { get { return name; } }
        private double price;
        public double Price { get { return price; } }

        [NonSerialized]
        private string iSON;

        public string ISON { get { return iSON; } }

        public Book(string bookname, double bookprice, string bookison)
        {
            name = bookname;
            price = bookprice;
            iSON = bookison;
        }
    }

//序列化
            Book book = new Book("Harry Potter", 25.23, "49384759i4034385u9");
            string path =  ++ @"";
            using (FileStream fs = new FileStream(path, ))
            {
                BinaryFormatter bf = new BinaryFormatter();
                (fs, book);
            }

            //反序列化
            book = null;
            using (FileStream fs = new FileStream(path, ))
            {
                BinaryFormatter bf = new BinaryFormatter();
                var specialbook = (Book)(fs);
                ( +  + );
            }

b.利用序列化的方式实现深度拷贝



public static T Clone<T>(T RealObject)
        {
            using (Stream objectStream = new MemoryStream())
            {
                //利用 序列化与反序列化完成引用对象的复制
                IFormatter formatter = new BinaryFormatter();
                (objectStream, RealObject);
                (0, );
                return (T)(objectStream);
            }
        }

2)JSON序列化时,相对而言性能最好的是Newtonsoft库,使用方法如下所示


    internal class Student
    {
        public int ID { get; set; }

        public string Name { get; set; }

        public int Age { get; set; }

        public string Sex { get; set; }
    }

Student student = new Student
            {
                ID = 1,
                Age = 23,
                Name = "msheng",
                Sex = "male"
            };

            string studentJson = (student);
            (studentJson);

            string str = "{\"ID\":2,\"Name\":\"Petter\",\"Age\":230,\"Sex\":\"男\"}";
            var item = <Student>(str);
            (() +  +  + );

            //序列化对象集合
            List<Student> oneList = new List<Student>() {
                new Student{ ID = 1, Name = "Tim", Age = 260, Sex = "男" },
                new Student{ ID = 2, Name = "Bob", Age = 250, Sex = "男" },
                new Student{ ID = 3, Name = "Marry", Age = 240, Sex = "女" }
            }; //定义对象

            string jsonData = (oneList); //序列化
            ("jsonData:" + jsonData);
            foreach (var s in <List<Student>>(jsonData))
            {
                (() +  +  + );
            }

如有不对之处还请拍砖。