zoukankan      html  css  js  c++  java
  • 序列化和反序列化

    一、概述

    何为序列化和反序列化?

    我们再传递数据的和保存数据时,我们可以用一个变量记录,但是如果是一个对象改怎么办呢,这是就得用序列化和反序列化。

    在计算机中,数据的存放都是二进制。我们传递数据也是传递二进制,根据这个不变性,我们把需要传递的变量序列化成一个二进制的数据保存并传递,再通过反序列化,就能够得到原来的对象。

    下面是一个实现序列化和反序列化的例子,我们通过特殊属性定义了一个  [Serializable]class myobject,在myobject中又有一个  [NoSerializable]的变量age

    通过变量传递后,我们发现,age的值是默认值0,而不是23.

    这说明,只有实现了序列化的变量/值,才能被传递,其他的不能。

        class Program
        {
            static void Main(string[] args)
            {
                Byte[] myArray = Seriliaze(new myObject());
                Console.WriteLine(DeSeriliaze(myArray));
                Console.ReadKey();
            }
    
            /// <summary>
            /// 序列化程序
            /// </summary>
            /// <param name="obj"></param>
            /// <returns></returns>
             static Byte[] Seriliaze(myObject obj)
            {
                ///IFormatter 提供将序列化对象格式化的功能
                ///BinaryFormatter 用二进制方式序列化或反序列化一个对象
                IFormatter formatter = new BinaryFormatter();
                using (MemoryStream stream = new MemoryStream())
                {
                    formatter.Serialize(stream, obj); //将对象序列化成一个内存流
                    return stream.ToArray();          //将内存流放入一个字节数组,并返回
                }
    
            }
             /// <summary>
             /// 序列化程序
             /// </summary>
             /// <param name="obj"></param>
             /// <returns></returns>
             static myObject DeSeriliaze(Byte[] byteArray)
             {
                 ///IFormatter 提供将序列化对象格式化的功能
                 ///BinaryFormatter 用二进制方式序列化或反序列化一个对象
                 IFormatter formatter = new BinaryFormatter();
                 //将字节数组放到内存流中
                 using (MemoryStream stream =new MemoryStream(byteArray))
                 {
                     return (myObject)formatter.Deserialize(stream); //将内存流反序列化成一个对象返回
                         
                 }
             }
            }
            /// <summary>
            /// 一个用来测试序列化的类
            /// </summary>
            [Serializable]
            class myObject
            { 
               String name = "nimei";
              [NonSerialized]
                int age = 23;
    
                public myObject()
                { 
            
                }
    
                public override string ToString()
                {
                     return String.Format("my name is {0};age is {1}",name,age);
                }
        
            }
    

      二、详细

         实现序列化的方法有哪些呢?

    在.net中是先序列化的方法有:BinaryFormatter,SoapFormatter,XmlSerilizer

    http://www.cnblogs.com/ejiyuan/archive/2009/01/21/1379256.html 这里讲的比较清楚,大家可以参考

  • 相关阅读:
    python ping监控
    MongoDB中一些命令
    进制转换(十进制转十六进制 十六进制转十进制)
    通过ssh建立点对点的隧道,实现两个子网通信
    linux环境下的各种后台执行
    python requests请求指定IP的域名
    不需要修改/etc/hosts,curl直接解析ip请求域名
    MongoDB数据update的坑
    windows平台使用Microsoft Visual C++ Compiler for Python 2.7编译python扩展
    rabbitmq问题之HTTP access denied: user 'guest'
  • 原文地址:https://www.cnblogs.com/fjsnail/p/3305950.html
Copyright © 2011-2022 走看看