在「RMS 從入門到精通」系列第一篇中,我們已奠定 Record Management System (RMS) 的基礎觀念。本文將深入探討在 J2ME 平台上進行資料持久化前的關鍵技術鋪墊:CLDC 版 Java IO 體系與自定義物件序列化機制。這兩項技術不僅是 RMS 高效運作的基石,也是 MIDP 網路通訊框架的核心依賴。
CLDC (Connected Limited Device Configuration) 定義的 IO 套件雖精簡,卻涵蓋了資料讀寫的核心類別,且與 J2SE/J2EE 介面相容,使得行動裝置能與 Servlet 等伺服端元件無縫通訊。在 RMS 開發中,最高頻使用的四大核心類別為:
預設的 ByteArrayOutputStream.toByteArray() 會建立內部緩衝區的副本,在記憶體受限的行動裝置上屬於浪費。解決方案是繼承該類別並暴露內部緩衝區引用:
public class MyByteArrayOutputStream extends ByteArrayOutputStream {
public byte[] getByteArray() {
return buf; // 直接返回內部緩衝區,零複製
}
}
採用此方式可顯著降低大量資料寫入 RMS 時的記憶體壓力。
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 序列化的最佳實踐:
若業務需求涉及關聯資料,建議拆分為多個 RecordStore,並以整數 ID 關聯,而非直接序列化物件引用。
掌握 CLDC IO 串流操作與自定義序列化,是開發高效能、穩定 J2ME 持久化應用的關鍵。下一篇將進入 RMS 核心 API 實戰:RecordFilter、RecordEnumeration 等進階查詢與遍歷技術。