在写JAVAME程序的时候,我们经常需要保存一些数据到手机里面,也经常希望能把对象也保存到手机里面,但是JAVAME里面没有反射机制,也没有java.io.Serializable接口,所以没有序列化的机制,要保存对象的话,就得自己动手了。
在JAVAME中,程序的数据保存的地方,无外乎两种,一种是把数据保存在RMS里面,这是所有的JAVAME的手机都支持的,还有一种就是把数据保存在手机的文件系统里面,这个不是所有手机都能支持的,只有支持JSR075的手机,才支持把数据保存在文件系统里面,并且如果你的程序没有经过签名的话,你每次保存或者读取,手机都会弹出恼人的提示,是否允许程序访问文件系统。所在我一般都是把数据存在RMS里面,因为读写RMS是安全的,并且也是不需要手机提示的。因为我们的RMS数据是存在一个特殊的地方。但是JAVAME的RMS功能非常底层,为了保存一些数据,我们必须和byte[]打交道,所以我就产生了,在此之前封装一层自己的程序的想法,这样封装好以后,使用起来就非常方便了。只要实现了相关接口,就可以享受到比较易用的方法了。
此框架总共包括了四个类,分别如下:Serializable类,它是一个接口,类似于JAVASE里面的Serializable接口,唯一不同的就是,JAVASE里面的接口是一个空接口,只做标记用的,而这里的这个接口是有方法需要实现的。
Lazy类,它也是一个接口,它定义了一些方法,如果你的对象比较大,需要惰性加载的时候,可以实现此接口,并且此接口是Serializable接口的子类,也就是说实现了Lazy接口,你就相当于实现了Serializable接口。
RMSUtil类,此类是一个工具类,用于统一进行RMS的相关操作,也是此框架的核心类。
RecordFetcher类,也是一个接口,它继承了RecordComparator, RecordFilter接口,在取数据的时候,需要用到它。
好了,下面我们就开始看代码吧。
1 /*
2 * To change this template, choose Tools | Templates
3 * and open the template in the editor.
4 */
5 package com.hadeslee.mobile.rms;
6
7 import java.io.IOException;
8
9 /**
10 * 一个可自己串行化的类所要实现的接口
11 * @author hadeslee
12 */
13 public interface Serializable {
14
15 /**
16 * 把自己编码成字节数组的格式
17 * @return 字节数组
18 */
19 public byte[] serialize() throws IOException;
20
21 /**
22 * 把一个对象用此字节数组进行重装
23 * @param data 字节数组
24 */
25 public void unSerialize(byte[] data) throws IOException;
26
27 /**
28 * 设置此对象序列化后对应的存储对象的ID
29 * @param id ID
30 */
31 public void setId(int id);
32
33 /**
34 * 得到此对象序列化后的ID
35 * 此方法唯有在反序列化后的对象上调用才有效
36 * 如果一个对象是没有序列化的,那么它的ID是-1;
37 * @return ID
38 */
39 public int getId();
40 }
41
1 /*
2 * To change this template, choose Tools | Templates
3 * and open the template in the editor.
4 */
5 package com.hadeslee.mobile.rms;
6
7 import java.io.IOException;
8
9 /**
10 * 可以延迟加载的对象必须要实现的接口
11 * @author binfeng.li
12 */
13 public interface Lazy extends Serializable {
14
15 /**
16 * 实现此接口的类要实现的方法
17 * 可以用于延迟加载某些属性。比如
18 * get("ImgData"),get("fullImage")..等等
19 * 由于J2ME不支持注释也不支持反射,所以只能以
20 * 此种方法来进行模拟了
21 * 此方法是RMSUtil要存对象的时候调用的,这样就可以把
22 * 一个对象的不同部份存到不同的RMS里面去了
23 * @param key 要得到的某性的键
24 * @return 其对应的值
25 * @throws IOException
26 */
27 public byte[] getAttach(Object key)throws IOException;
28
29 /**
30 * 当把某个附属的对象保存进去以后,所要调用的
31 * 方法,此方法告诉主体,它的那个附件被保存后
32 * 在RMS里面对应的ID是多少
33 * @param key
34 * @param id
35 */
36 public void savedAttach(Object key, int id);
37
38 /**
39 * 得到此对象所支持的所有的key的数组
40 * @return KEY的数组,不能为NULL
41 */
42 public Object[] getAttachKeys();
43
44 /**
45 * 此对象的附属对象所存的RMS的名字
46 * @return RMS的名字
47 */
48 public String getNameOfAttachRMS();
49 }
50
1 /*
2 * To change this template, choose Tools | Templates
3 * and open the template in the editor.
4 */
5 package com.hadeslee.mobile.rms;
6
7 import javax.microedition.rms.RecordComparator;
8 import javax.microedition.rms.RecordFilter;
9
10 /**
11 * 此类是一个继承了两个接口的接口,并且添加了自己
12 * 的方法,自己的方法是用于通知数量以及开始取的位置
13 * 只是为了方便于传递参数以及以后扩展
14 * @author binfeng.li
15 */
16 public interface RecordFetcher extends RecordComparator, RecordFilter {
17
18 /**
19 * 从哪个下标开始取
20 * @return 下标
21 */
22 public int getFromIndex();
23
24 /**
25 * 最多取多少条记录
26 * @return 记录
27 */
28 public int getMaxRecordSize();
29 }
30