Java 教程

Java 控制语句

面向对象编程

Java 内置类

Java 文件处理

Java 错误与异常

Java 多线程

Java 同步

Java 网络编程

Java 集合

Java 接口

Java 数据结构

Java 集合算法

高级Java

Java 其他

Java APIs与框架

Java 类引用

Java 有用资源

Java - transient关键字



在Java中,序列化是一个概念,我们可以使用它将对象的状态写入字节流中,以便我们可以通过网络传输它(使用JPA和RMI等技术)。

序列化类的对象时,如果希望JVM忽略特定的实例变量,可以将其声明为transient。

语法

public transient int limit = 55; // will not persist
public int b; // will persist

示例

在下面的Java程序中,Student类有两个实例变量name和age,其中age被声明为transient。在名为ExampleSerialize的另一个类中,我们尝试序列化和反序列化Student对象并显示其实例变量。由于age被设置为不可见(transient),因此只显示name的值。

package com.tutorialspoint;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

class Student implements Serializable{

   private static final long serialVersionUID = 1L;
   private String name;
   private transient int age;

   public Student(String name, int age){
      this.name = name;
      this.age = age;
   }
   public String getName() {
      return this.name;
   }
   public void setName(String name) {
      this.name = name;
   }
   public void setAge(int age) {
      this.age = age;
   }
   public int getAge() {
      return this.age;
   }
}
public class ExampleSerialize{
   public static void main(String args[]) throws Exception{
      Student std1 = new Student("Krishna", 30);
      FileOutputStream fos = null;
      ObjectOutputStream oos = null;
      FileInputStream fis = null;
      ObjectInputStream ois = null;

      try {
         fos = new FileOutputStream("/tmp/student.ser");
         oos = new ObjectOutputStream(fos);
         oos.writeObject(std1);

         fis = new FileInputStream("/tmp/student.ser");
         ois = new ObjectInputStream(fis);
         Student std2 = (Student) ois.readObject();
         System.out.println(std2.getName());
      } catch(IOException e) {
         oos.close();
         fos.close();
         ois.close();
         fis.close();    	  
      }
   }
}

输出

Krishna

示例

在下面的Java程序中,我们创建、序列化和反序列化一个employee对象。

员工

package com.tutorialspoint;

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

SerializeDemo

package com.tutorialspoint;

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

下面的SerializeDemo程序实例化一个Employee对象并将其序列化到文件中。程序执行完毕后,将创建一个名为employee.ser的文件。

DeserializeDemo

package com.tutorialspoint;

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

以下是需要注意的重要几点:

  • try/catch块尝试捕获ClassNotFoundException,这是readObject()方法声明的。为了使JVM能够反序列化对象,它必须能够找到该类的字节码。如果JVM在对象的反序列化过程中找不到类,则会抛出ClassNotFoundException。

  • 请注意,readObject()的返回值被强制转换为Employee引用。

  • 当对象被序列化时,SSN字段的值为11122333,但由于该字段是transient,因此此值未发送到输出流。反序列化的Employee对象的SSN字段为0。

java_basic_syntax.htm
广告