欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#序列化与反序列化。

程序员文章站 2023-11-09 21:37:46
序列化介绍: 把对象用一种新的格式来表示。 系列化只序列化数据。 序列化不建议使用自动属性 为什么要序列化: 将一个复杂的对象转换流,方便存储与信息交换。 二进制序列化: 就是将对象变成流的过程,把对象变成byte[ ]。 反序列化: 练习:添加对象到array list中,进行序列化和反序列化。 ......

序列化介绍:

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

系列化只序列化数据。

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

为什么要序列化:

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

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);
                }
            }
           
            
        }    
    }