java - android - 为什么在存储到文件之前序列化?

时间:2015-04-11 08:54:19

标签: java android file serialization storage

上下文:

我想将对象存储到文件中。

我知道每个的大小以及对象的整体大小。 没有涉及网络:只需本地存储读/写。

在C中,出于性能原因,我存储了我的结构(再次,只是本地数据,不,它不会咬人:我控制大小,显然不涉及指针)。

问题:

每个人都希望我先排序。所有的tutos首先序列化。

"这样做是因为它就像那样" - >表现受到欢迎。

为什么它不可能将整个对象存储在文件中并稍后在java中获取(< - >隐藏指针?)?

2 个答案:

答案 0 :(得分:1)

我还没有足够的声誉点来添加评论,但是,我想跟进Zielu的回答:https://stackoverflow.com/a/29577482/789358

如果要降低默认编组/解组的性能,Java确实提供了另一种可以手动持久保存对象的机制。但是,它肯定需要你更多的簿记。

要执行此操作,请实施Externalizable而不是Serializable。这将迫使您实现另外两种方法:

public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;
public void writeExternal(ObjectOutput out) throws IOException;

HereSerializable效果与Externalizable的良好比较。 here是如何开始实施Externalizable的好介绍。

您还可以使用RandomAccessFile类更精细地工作,这可能更接近C风格,因为它涉及根据对象中元素的字节大小跟踪文件指针。你可以很容易地在网上找到一个类的例子。

答案 1 :(得分:0)

可以想象以您自己的方式将整个对象存储在文件Java中。

每个人都建议您进行序列化,因为Java中有内置机制,它可以完全实现:将对象的内容保存到文件中。

因此,您只需将implements Serializable添加到您的类定义中,而不是编写自己的代码,您可以将其保存为简单的文件:

try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("your file")) {
    out.writeObject(yourObject);
}

如果你想自己实现它,你可以,但当然它将需要超过这3行代码,你需要测试它并修复错误。一旦你改变你的对象定义,你需要修复你的写作和阅读方法......

因此,Java序列化可以处理许多“困难案例”,这只是方便和智能的便利。 (例如,对象图中的循环)。

通常,您将以序列化作为基本机制开始,然后您可以进一步调整。例如,您对输出文件大小不满意(序列化是一般的'方法对简单数据结构有很多开销)。您可以自己处理部分序列化过程,使其更加优化。

例如,您可以实施Externalizable而不是Serializable并实施:

public void writeExternal(ObjectOutput out)
public void readExternal(ObjectInput in)

并在这些方法中将整个对象内容编码/解码为一个字符串,并为字段添加一些分隔符。

您还可以将@XmlRootElement放在类的顶部并使用JAXB(再次整个保存需要3行代码),将对象存储为xml。

还有JSON libriaries。

简单地说,使用内置机制更安全,经过测试而不是编写自己的机制。