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

java - android - why serialize before storing to file?

上下文:

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

我知道每个对象的大小,所以对象的整体大小。 不涉及网络:只有本地存储 read/write.

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

问题:

大家都要我先连载。所有教程先连载

“这样做是因为它就像那样” -> 性能下降。

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

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

每个人都建议您序列化,因为 Java 中有内置机制可以做到这一点:将对象的内容保存到文件中。

因此,无需编写您自己的代码,您只需将 implements Serializable 添加到您的 class 定义中,您可以使用简单的方式将其保存为文件:

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

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

所以这只是方便和聪明的方便,因为 Java 序列化可以处理很多 'difficult cases as well'(例如对象图中的循环)。

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

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

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

在这些方法中 code/decode 将您的对象内容作为一个带有字段分隔符的字符串。

您还可以通过将 @XmlRootElement 放在 class 之上并使用 JAXB 将对象存储为 xml(同样,整个保存将需要 3 行代码)。

还有 JSON 个图书馆。

简而言之,使用经过测试可以工作的内置机制比自己编写机制更容易也更安全。

我还没有足够的声望点来添加评论,但是,我想跟进下面 Zielu 的回答:

如果您想减少默认 marshalling/demarshalling 的性能影响,Java 确实提供了另一种机制,您可以通过该机制手动保留对象。但是,这肯定需要您多做一些簿记工作。

为此,实施 Externalizable 而不是 Serializable。这将迫使您再实施两种方法:

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

Here is a good comparison of Serializable performance versus Externalizable. And here 很好地介绍了如何开始实施 Externalizable

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