将对象保存到文件
回答
如果对象符合Java Bean规范(不同于Serializable要求),则可以使用java.beans.XMLEncoder。
该OP特别说他/她的对象是不可序列化的。 JavaBeans规范要求§5.5中的“所有bean必须支持序列化或外部化”,所以他/她的对象不符合Java Bean规范。 –
@StefanoSanfillipo尽管如此,你也可以通过查看它或者自己尝试它来发现它,而不是对你一无所知的事物进行疯狂的声明,但是没有像使用该编码器的可序列化那样的要求。 – EJP
我只是想通过留言来帮助您更准确地回答这个问题。如果你认为这是挑剔,我很抱歉。我承认我没有调查这种方法,但是我看到了一种不协调的情况,我想让你知道。 –
如果您正在避免默认的java序列化,则有两个选项。
您可以编写一个自定义写入器和读取器,在其中将msnually写入文件的值。您也可以有读取文件并返回对象的阅读器。这是很多工作,不值得。
另一种选择是使用JSON或XML序列化库(不使用java序列化)。
例如:http://www.mkyong.com/java/how-to-convert-java-object-to-from-json-jackson/
保存在一个文件中的对象意味着节约其状态,字段。你可以试试java.io.DataOutputStream
,它有所有必要的方法来保存任何原始类型和字符串。您稍后可以通过从java.io.DataInputStream
的文件中读取其字段来重新创建该对象。它取决于对象类,但如果对象不是一个bean,也就是说它不允许读取/设置它的字段,你仍然可以尝试使用反射来访问它的字段。
它不适用于所有情况,但您可以使用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;
}
如果你被允许使用第三方库,你可以尝试使用序列化库像Kryo。
- 1. 将Javascript对象保存到文件
- 2. 将Java对象保存到文件中
- 3. 将对象保存到文件
- 4. 如何将对象保存到文件?
- 5. PyQt将对象保存到文件
- 6. R将poLCA对象保存到文件
- 7. 无法将类对象保存到共享对象文件
- 8. 将对象保存到Firebase
- 9. 以NSData对象的形式将文件保存到文件
- 10. 将对象保存为plist文件
- 11. 保存对象到BinaryFormatter的文件
- 12. 将我的网页中的图像对象保存到文件
- 13. 如何将C++对象保存到xml文件并恢复?
- 14. Java-将对象数据保存到一个文件
- 15. 如何将对象保存到Node.js中的文件中?
- 16. 如何将对象的模板化阵列保存到文件?
- 17. 无法将哈希表对象保存到Android中的文件
- 18. 将对象的Arraylist保存到外部文件Java
- 19. 关于将对象保存到文件的指导原则
- 20. 将对象的矢量保存到C++文件中
- 21. 如何将对象保存到文件(AS3/Air)
- 22. 将JavaScript对象保存到带有中断字的文件中
- 23. 如何在Delphi中将对象保存到文件中
- 24. 如何将QPixmap对象保存到文件?
- 25. 如何将对象保存到Visual Studio中的fooSettings.settings文件中?
- 26. 将消息对象从JavaMail保存到文件系统
- 27. 如何使用boto3将S3对象保存到文件中
- 28. 将对象保存到Python中的JSON或XML文件中
- 29. 创建一个新线程将对象保存到文件
- 30. 将音频记录保存到文件对象
我很难解释。 我只是有一个对象,需要将其保存到磁盘。 – xDarcade
Upvoted无谓的无法解释的downvote。这些评论的质量令人沮丧。我不明白为什么人们评论他们不明白的东西,或者他们不知道他们在说什么。 – EJP
@StefanoSanfillipo唯一需要的链接是我认为在一个评论而不是两个评论中都提到他们。也许你可以停止挑剔,并学习关于这个主题的话题。否则你在这里的存在是莫名其妙的。 – EJP