我需要将一个包含所有属性的对象保存到文件中。
我不允许更改对象的类。 Object是不可序列化的。 那么我怎样才能将Object保存到文件中供以后使用?
答案 0 :(得分:2)
如果对象符合Java Bean规范(Serializable要求除外),则可以使用java.beans.XMLEncoder。
答案 1 :(得分:2)
如果您避免使用默认的java序列化,则有两个选项。
您可以编写自定义编写器和读取器,在此处将值写入文件。您还可以使用读取器读取文件并返回对象。这是很多工作,不值得。
另一种选择是使用JSON或XML序列化库(不使用java序列化)。
例如:http://www.mkyong.com/java/how-to-convert-java-object-to-from-json-jackson/
答案 2 :(得分:0)
将对象保存在文件中意味着保存其状态字段。您可以尝试java.io.DataOutputStream
,它具有保存所有基本类型和字符串的所有必要方法。您可以稍后通过使用java.io.DataInputStream
从文件中读取其字段来重新创建对象。它取决于对象类,但即使对象不是bean,也就是说它不允许读取/设置其字段,你仍然可以尝试使用反射来访问它的字段。
答案 3 :(得分:0)
它并不适用于所有情况,但您可以使用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;
}
答案 4 :(得分:0)
如果您被允许使用第三方库,则可以尝试使用Kryo等序列化库。