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

J2ME Record Management System 進階:Java IO 與自定義序列化實作

     編輯:J2ME

前言

在「RMS 從入門到精通」系列第一篇中,我們已奠定 Record Management System (RMS) 的基礎觀念。本文將深入探討在 J2ME 平台上進行資料持久化前的關鍵技術鋪墊:CLDC 版 Java IO 體系與自定義物件序列化機制。這兩項技術不僅是 RMS 高效運作的基石,也是 MIDP 網路通訊框架的核心依賴。

一、CLDC 精簡版 Java IO 架構

CLDC (Connected Limited Device Configuration) 定義的 IO 套件雖精簡,卻涵蓋了資料讀寫的核心類別,且與 J2SE/J2EE 介面相容,使得行動裝置能與 Servlet 等伺服端元件無縫通訊。在 RMS 開發中,最高頻使用的四大核心類別為:

  • ByteArrayInputStream:將位元組陣列轉換為輸入串流。
  • ByteArrayOutputStream:將記憶體緩衝區資料轉換為位元組陣列。
  • DataInputStream / DataOutputStream:提供對 Java 基本資料型別(int、boolean 等)及 String 的讀寫支援,通常包裝在上述兩個位元組串流之上。

效能優化:避免 ByteArrayOutputStream 的額外記憶體複製

預設的 ByteArrayOutputStream.toByteArray() 會建立內部緩衝區的副本,在記憶體受限的行動裝置上屬於浪費。解決方案是繼承該類別並暴露內部緩衝區引用:

public class MyByteArrayOutputStream extends ByteArrayOutputStream {
    public byte[] getByteArray() {
        return buf; // 直接返回內部緩衝區,零複製
    }
}

採用此方式可顯著降低大量資料寫入 RMS 時的記憶體壓力。

二、J2ME 中實現物件序列化

J2ME 並未內建 Java 物件序列化機制,但我們可透過 DataOutputStream/DataInputStream 手動實作。以 Bank 類別為例:

資料模型

public class Bank {
    private String bankName;
    private String phone;
    private int employeeNum;

    // 建構子與 Getter 略...
}

序列化與反序列化方法

public byte[] serialize() throws IOException {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    DataOutputStream dos = new DataOutputStream(bos);

    dos.writeUTF(bankName);
    dos.writeUTF(phone);
    dos.writeInt(employeeNum);
    dos.flush();

    return bos.toByteArray(); // 或使用上述優化版 getByteArray()
}

public static Bank deserialize(byte[] data) throws IOException {
    ByteArrayInputStream bis = new ByteArrayInputStream(data);
    DataInputStream dis = new DataInputStream(bis);

    Bank bank = new Bank();
    bank.bankName = dis.readUTF();
    bank.phone = dis.readUTF();
    bank.employeeNum = dis.readInt();

    return bank;
}

實際儲存與讀取範例

// 寫入 RMS
Bank aBank = new Bank("Central Bank", "123-4567", 100);
RecordStore rs = RecordStore.openRecordStore("BankDB", true);
try {
    byte[] data = aBank.serialize();
    rs.addRecord(data, 0, data.length);
} catch (IOException | RecordStoreException e) {
    // 錯誤處理
}

// 從 RMS 讀取並還原
byte[] data = rs.getRecord(recordId);
Bank restoredBank = Bank.deserialize(data);

三、設計原則:保持資料結構扁平化

上述範例中,Bank 類別僅包含基本型別與 String,不含其他物件引用。這是 J2ME 序列化的最佳實踐:

  • 避免巢狀物件圖帶來的遞迴序列化複雜度。
  • 減少記憶體碎片與 GC 壓力。
  • 確保序列化/反序列化邏輯簡單、可預測、易除錯。

若業務需求涉及關聯資料,建議拆分為多個 RecordStore,並以整數 ID 關聯,而非直接序列化物件引用。

小結

掌握 CLDC IO 串流操作與自定義序列化,是開發高效能、穩定 J2ME 持久化應用的關鍵。下一篇將進入 RMS 核心 API 實戰:RecordFilter、RecordEnumeration 等進階查詢與遍歷技術。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved