我需要将一个对象及其所有属性保存到文件中。
我不允许更改对象的类。此对象无法序列化。那么我该如何将此对象保存到文件中以备后用?
我需要将一个对象及其所有属性保存到文件中。
我不允许更改对象的类。此对象无法序列化。那么我该如何将此对象保存到文件中以备后用?
它并不适用于所有情况,但您可以使用ObjectOutputStream
。
假设您的类Foo
不可序列化。创建另一个FooState
来包含Foo
实例状态。
public class Foo {
private String string;
private Date date;
/* ... */
}
public class FooState {
private String string;
private Date date;
public FooState(Foo foo) {
this.string = foo.getString();
this.date = foo.getDate();
/* ... */
}
private Object readResolve() throws ObjectStreamException {
return new Foo(string, date, ...);
}
}
然后子类化ObjectOutputStream
。使用这个类,可以在序列化和反序列化时透明地替换非可序列化对象为可序列化对象。
public class FooObjOutputStream extends ObjectOutputStream {
public FooObjOutputStream(OutputStream out) throws IOException {
super(out);
enableReplaceObject(true);
}
protected FooObjOutputStream() throws IOException, SecurityException {
super();
enableReplaceObject(true);
}
@Override
protected Object replaceObject(Object obj) throws IOException {
if (obj instanceof Foo) {
return new FooState((Foo) obj);
} else {
return super.replaceObject(obj);
}
}
}
然后进行序列化/反序列化
private static byte[] serialize(Object o) throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
FooObjOutputStream oos = new FooObjOutputStream(baos); // Magically handling Foo objects
oos.writeObject(o);
oos.flush();
oos.close();
return baos.toByteArray();
}
public static Object deserialize(byte[] bytes) throws IOException, ClassNotFoundException {
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bais);
Object o = ois.readObject();
bais.close();
return o;
}
java.io.DataOutputStream
,它具有保存任何原始类型和字符串所需的所有方法。稍后,您可以通过使用java.io.DataInputStream
从文件中读取其字段来重新创建对象。这取决于对象类,但即使对象不是一个bean,也就是说它不允许读取/设置其字段,您仍然可以尝试使用反射来访问其字段。