Java 序列化

Posted JccVirtual

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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传输对象的时候;

 

 

以上是关于Java 序列化的主要内容,如果未能解决你的问题,请参考以下文章

java 代码片段【JAVA】

# Java 常用代码片段

# Java 常用代码片段

创建片段而不从 java 代码实例化它

如何重构这个 Java 代码片段

java 反射代码片段