需要在手机上保存很多好友的信息,每个Friend对象定义有Family,Name,Given Name,Age,Telephone等若干属性。RMS中引入对象序列化。所谓对象序列化,就是将对象的状态转换成字节流,以后可以通过这些值在生成相同状态的对象。整个转换过程需要ByteArrayOutputStream、DataOutputStream、ByteArrayInputStream、DataInputStream四个类的协助。
于是,我们就不需要将信息存好多列,只需要按照对象存储就可以了,就像数据库那样,每一条数据有多个字段。
现在上代码
MIDlet
package com.zeph.j2me.object.serilize;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.TextField;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
/**
* 对象序列化
*
* @author Ben Zeph
*
*/
public class ObjectSerilizeMIDlet extends MIDlet {
private Display display;
private Form form;
private TextField brandTextField;
private TextField modelTextField;
private TextField osTextField;
private TextField priceTextField;
public ObjectSerilizeMIDlet() {
display = Display.getDisplay(this);
form = new Form("对象序列化");
brandTextField = new TextField("品牌", "", 10, TextField.ANY);
modelTextField = new TextField("型号", "", 10, TextField.ANY);
osTextField = new TextField("操作系统", "", 10, TextField.ANY);
priceTextField = new TextField("价格", "", 10, TextField.NUMERIC);
form.append(brandTextField);
form.append(modelTextField);
form.append(osTextField);
form.append(priceTextField);
}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
}
protected void pauseApp() {
}
protected void startApp() throws MIDletStateChangeException {
display.setCurrent(form);
SmartPhone phone = new SmartPhone("Apple", "iphone4s", "ios5", 7999);
SmartPhoneRecordStore rs = new SmartPhoneRecordStore("SmartPhone");
rs.addRecord(Serializer.serialize(phone));
SmartPhone iphone4s = Serializer.deserialize(rs.getRecord(1));
brandTextField.setString(iphone4s.getBrand());
modelTextField.setString(iphone4s.getModel());
osTextField.setString(iphone4s.getOs());
priceTextField.setString(String.valueOf(iphone4s.getPrice()));
}
}
Serialize
package com.zeph.j2me.object.serilize;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
/**
* 数据序列化工具类
*
* @author Ben Zeph
*
*/
public class Serializer {
public static byte[] serialize(SmartPhone phone) {
byte[] data = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
try {
dos.writeUTF(phone.getBrand());
dos.writeUTF(phone.getModel());
dos.writeUTF(phone.getOs());
dos.writeInt(phone.getPrice());
dos.flush();
data = baos.toByteArray();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (baos != null) {
baos.close();
baos = null;
}
if (dos != null) {
dos.close();
dos = null;
}
} catch (IOException e) {
e.printStackTrace();
}
}
return data;
}
public static SmartPhone deserialize(byte[] data) {
SmartPhone phone = new SmartPhone();
ByteArrayInputStream bais = new ByteArrayInputStream(data);
DataInputStream dis = new DataInputStream(bais);
try {
phone.setBrand(dis.readUTF());
phone.setModel(dis.readUTF());
phone.setOs(dis.readUTF());
phone.setPrice(dis.readInt());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (dis != null) {
dis.close();
dis = null;
}
if (bais != null) {
bais.close();
bais = null;
}
} catch (IOException e) {
e.printStackTrace();
}
}
return phone;
}
}
Smartphone
package com.zeph.j2me.object.serilize;
/**
* 智能手机
*
* @author Ben Zeph
*
*/
public class SmartPhone {
/** 品牌 */
private String brand;
/** 型号 */
private String model;
/** 操作系统 */
private String os;
/** 价格 */
private int price;
public SmartPhone() {
}
public SmartPhone(String brand, String model, String os, int price) {
this.brand = brand;
this.model = model;
this.os = os;
this.price = price;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public String getOs() {
return os;
}
public void setOs(String os) {
this.os = os;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
}
RecordStore
package com.zeph.j2me.object.serilize;
import javax.microedition.rms.InvalidRecordIDException;
import javax.microedition.rms.RecordStore;
import javax.microedition.rms.RecordStoreException;
import javax.microedition.rms.RecordStoreFullException;
import javax.microedition.rms.RecordStoreNotFoundException;
import javax.microedition.rms.RecordStoreNotOpenException;
/**
* 智能手机记录存储类
*
* @author Ben Zeph
*
*/
public class SmartPhoneRecordStore {
private RecordStore rs = null;
private String RecordStoreName;
public SmartPhoneRecordStore(String RecordStoreName) {
this.RecordStoreName = RecordStoreName;
try {
rs = RecordStore.openRecordStore(this.RecordStoreName, true);
rs.closeRecordStore();
} catch (RecordStoreFullException e) {
e.printStackTrace();
} catch (RecordStoreNotFoundException e) {
e.printStackTrace();
} catch (RecordStoreException e) {
e.printStackTrace();
}
}
/**
* 添加记录
*
* @param record
*/
public void addRecord(byte[] data) {
try {
rs = RecordStore.openRecordStore(this.RecordStoreName, true);
rs.addRecord(data, 0, data.length);
rs.closeRecordStore();
} catch (RecordStoreNotOpenException e) {
e.printStackTrace();
} catch (RecordStoreFullException e) {
e.printStackTrace();
} catch (RecordStoreException e) {
e.printStackTrace();
}
}
/**
* 删除记录
*
* @param id
*/
public void deleteRecord(int id) {
try {
rs = RecordStore.openRecordStore(this.RecordStoreName, true);
rs.deleteRecord(id);
rs.closeRecordStore();
} catch (RecordStoreNotOpenException e) {
e.printStackTrace();
} catch (InvalidRecordIDException e) {
e.printStackTrace();
} catch (RecordStoreException e) {
e.printStackTrace();
}
}
/**
* 获取记录
*
* @param id
* @return
*/
public byte[] getRecord(int id) {
byte[] data = null;
try {
rs = RecordStore.openRecordStore(this.RecordStoreName, true);
data = rs.getRecord(id);
rs.closeRecordStore();
} catch (RecordStoreNotOpenException e) {
e.printStackTrace();
} catch (InvalidRecordIDException e) {
e.printStackTrace();
} catch (RecordStoreException e) {
e.printStackTrace();
}
return data;
}
/**
* 修改记录
*
* @param record
* @param id
*/
public void setRecord(String record, int id) {
byte[] data = record.getBytes();
try {
rs = RecordStore.openRecordStore(this.RecordStoreName, true);
rs.setRecord(id, data, 0, data.length);
rs.closeRecordStore();
} catch (RecordStoreNotOpenException e) {
e.printStackTrace();
} catch (InvalidRecordIDException e) {
e.printStackTrace();
} catch (RecordStoreException e) {
e.printStackTrace();
}
}
}