首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 序列化完整教學:Serializable 介面、ObjectOutputStream/ObjectInputStream、transient 關鍵字與跨平台特性

     編輯:Java 程式設計入門

Java 序列化完整教學

Java 提供物件序列化機制:將物件轉換為位元組序列(含資料、類別型別資訊、資料型別),寫入檔案後可反序列化重建物件。整個過程 JVM 獨立,跨平台可用。


核心類別與方法

  • ObjectOutputStream:writeObject(Object x) 序列化物件至輸出流
  • ObjectInputStream:readObject() 反序列化,回傳 Object 需強制轉型

序列化前提條件

  1. 類別必須實作 java.io.Serializable 介面
  2. 所有屬性必須可序列化;不可序列化屬性需標記 transient

範例類別:Employee.java

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.java

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 fos = new FileOutputStream("/tmp/employee.ser");
            ObjectOutputStream out = new ObjectOutputStream(fos);
            out.writeObject(e);
            out.close(); fos.close();
            System.out.printf("Serialized data is saved in /tmp/employee.ser");
        } catch (IOException i) { i.printStackTrace(); }
    }
}

慣例:序列化檔案副檔名用 .ser。


反序列化物件:DeserializeDemo.java

import java.io.*;

public class DeserializeDemo {
    public static void main(String[] args) {
        Employee e = null;
        try {
            FileInputStream fis = new FileInputStream("/tmp/employee.ser");
            ObjectInputStream in = new ObjectInputStream(fis);
            e = (Employee) in.readObject();
            in.close(); fis.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

關鍵重點解析

  • readObject() 需捕捉 ClassNotFoundException:JVM 必須找到類別位元碼才能反序列化
  • 回傳值需強制轉型:(Employee) in.readObject()
  • transient 欄位(SSN)不會被序列化,反序列化後為預設值(int 為 0)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved