zoukankan      html  css  js  c++  java
  • Java 序列化

    1、个人理解

    • Java对象序列化是指把一个对象表示为字节序列,该字节序列会包括该对象类型、对象的数据、数据类型等信息;
    • 序列化对象可以被写入到文件中;
    • 也可以从文件中读取出来再进行反序列化得到对象实例。

    2、书面解释

    • 关于序列化,常又称为持久化,将其写入磁盘中。
    • 进而对于编码规则来说:任一 一个实体类必须要去实现 Serializable 接口,方便以后将该类持久化,或者将其用于转为字节数组,用于网络传输。

    3、transient 关键字

    对于一个实体对象,不想将所有的属性都进行序列化,有专门的关键字 transient

      private transient String name;

      当对该类序列化时,会自动忽略被 transient 修饰的属性

      当然该对象反序列话的时候也就不存在这个name属性值了

    4、案例

    要被序列化的类

    public class Employee implements java.io.Serializable
    {
       public String name;
       public String address;
       public transient int SSN;//这个值不会被序列化传过去
       public int number;
       public void mailCheck()
       {
          System.out.println("Mailing a check to " + name
                               + " " + address);
       }
    }
    

      

    序列化对象

      注意 ObjectOutputStream 类的 writeObject(Object obj ) 方法,这个方法可以序列化一个对象

    import java.io.*;
     
    public class SerializeDemo
    {
       public static void main(String [] args)
       {
          Employee e = new Employee();
          e.name = "Reyan Ali";
          e.address = "Phokka Kuan, Ambehta Peer";
          e.SSN = 11122333;
          e.number = 101;
          try
          {
             FileOutputStream fileOut = new FileOutputStream("/tmp/employee.ser");
             ObjectOutputStream out = new ObjectOutputStream(fileOut);
             out.writeObject(e);
             out.close();
             fileOut.close();
             System.out.printf("Serialized data is saved in /tmp/employee.ser");
          }catch(IOException i)
          {
              i.printStackTrace();
          }
       }
    }
    

      

    反序列化对象

       注意 ObjectInputStream 的 readObject() 方法,可以反序列化对象

    import java.io.*;
     
    public class DeserializeDemo
    {
       public static void main(String [] args)
       {
          Employee e = null;
          try
          {
             FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
             ObjectInputStream in = new ObjectInputStream(fileIn);
             e = (Employee) in.readObject();
             in.close();
             fileIn.close();
          }catch(IOException i)
          {
             i.printStackTrace();
             return;
          }catch(ClassNotFoundException c)
          {
             System.out.println("Employee class not found");
             c.printStackTrace();
             return;
          }
          System.out.println("Deserialized Employee...");
          System.out.println("Name: " + e.name);
          System.out.println("Address: " + e.address);
          System.out.println("SSN: " + e.SSN);
          System.out.println("Number: " + e.number);
    
          /**
           *Deserialized Employee...
            Name: Reyan Ali
            Address:Phokka Kuan, Ambehta Peer
            SSN: 0
            Number:101
           */
     
    
        }
    }
    

      

    5、为什么要序列化

    序列化就是把一个原本存储在堆Heap中的存储得略复杂的信息 序列化成一个.ser文件,方便存储和传输;

    为了保存对象在内存中的状态(对象类型、数据类型、数据值这些),并且可以把保存的对象读出来;

     

    参考链接:

    https://www.cnblogs.com/sunhaoyu/p/4581282.html

    6、什么时候要使用序列化

    • 当你想把的内存中的对象保存到一个文件中或者数据库中时候;
    • 当你想用套接字在网络上传送对象的时候;
    • 当你想通过RMI传输对象的时候;

     

    -------------------------------------------------------------------------------------------------------------------------------------------------------------- 白云苍狗时光飞,嘻嘻哈哈一生追。哈!
  • 相关阅读:
    数据库-第六章 关系数据理论-6.2.1 函数依赖
    数据库-第六章 关系数据理论-6.1 问题的提出
    编译原理-第四章 语法分析-4.4 自顶向下的语法分析
    计算机组成及系统结构-第五章 指令系统
    编译原理-第四章 语法分析-4.3 设计文法
    Java数据结构之堆和优先队列
    进程与线程杂谈
    Java的多态浅谈
    Java的自定义注解使用实例
    elasticsearch6.6.2在Centos6.9的安装
  • 原文地址:https://www.cnblogs.com/sangong/p/9581868.html
Copyright © 2011-2022 走看看