保存对象信息的几种方法

 我们经常会碰到需要保存对象的信息到数据库或SD卡,常用的这么几种:

1. 使用数据库表来保存。表里的每个字段对应着对象里的一个字段。
实现方式:地球人都知道
优点:灵活、可控性强。
缺点:代码相对繁琐。且版本升级增加字段,需要另外处理。
适用场景:只需保存部分信息时、需要对部分字段进行排序、筛选等处理时

2. 对象序列化到SD卡
实现方式:代码片段如下

public class AdBean implements Serializable {
private static final long serialVersionUID = -6303619402641376846L;

}

public static void writeDataToSdcard(List beans, String fileName) {
ObjectOutputStream out = null;
try {
FileOutputStream fileOut = new FileOutputStream(fileName, false);
out = new ObjectOutputStream(fileOut);
out.writeObject(fileName);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
} finally {
try {
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static List readDataFromFile(String fileName) {
if (!FileUtil.isFileExist(fileName)) {
return null;
}
ObjectInputStream in = null;
List obj = null;
try {
FileInputStream fileInput = new FileInputStream(fileName);
in = new ObjectInputStream(fileInput);
obj = (List) in.readObject();
} catch (Throwable e) {
FileUtil.delFile(fileName);
} finally {
try {
in.close();
} catch (Exception e) {
FileUtil.delFile(fileName);
}
}
return obj;
}

优点:实现简单,只需实现接口Serializable。支持List等容器类
缺点: 必须是定义静态成员变量serialVersionUID,否则升级版本增加成员变量后,无法读取旧版本数据
容易出一下奇怪的BUG。如用户反馈的crash
class java.lang.String not compatible with class java.io.ObjectStreamClass
at java.io.ObjectInputStream.readFieldValues(ObjectInputStream.java:1124)
at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:454)
at java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1345)
at java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1242)
at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1835)
at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:761)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1983)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1940)
at java.util.ArrayList.readObject(ArrayList.java:661)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1330)
at java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1242)
at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1835)
at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:761)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1983)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1940)
at java.io.ObjectInputStream.readFieldValues(ObjectInputStream.java:1113)
at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:454)
at java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1345)
at java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1242)
at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1835)
at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:761)

适用场景:不建议使用

3.转为JSON数据存储
实现方式:保存时先写入json对象,再保存其string即可
优点:实现方式比数据库表简单些,版本升级增加字段处理方式简单,也不会出现对象序列化方式容易出现的问题
缺点:不如数据库表灵活
适用场景:需要存储整个对象的信息,且其成员变量比较多时

综上
对象成员变量比较少或只需存储部分成员变量、需要进行排序筛选等数据处理时,可选用数据库表
对象成员变量比较多且需要存储整个对象的信息,可转为JSON存储
而若后者的情况,也需要进行排序筛选等数据处理时,可将二者结合。将整个对象转为JSON存储到数据库表,待排序/筛选字段也同时作为数据库表的一个字段存起来。当然这时难免会有一些冗余数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值