序列化:基本理解和文档

Posted

技术标签:

【中文标题】序列化:基本理解和文档【英文标题】:Serialization: Basic understanding and documentation 【发布时间】:2020-08-22 10:05:35 【问题描述】:

在流中,对任何对象的第一次引用会导致 被序列化或外部化的对象以及 该对象的句柄对该对象的后续引用被编码为句柄。使用对象句柄可以保留共享和 在对象图中自然发生的循环引用。随后的 对对象的引用仅使用句柄允许非常紧凑 表示。

除了可序列化的字段,原始数据被写入 块数据记录中的流每个记录都以 标记和记录中字节数的指示。

    以上内容来自 Oracle Docs for Serialization。我正在阅读序列化以获得更好和深入的理解,有人可以帮我用简单的英语解码突出显示的部分。 (我正在寻找关于如何生成流的上下文中的答案,尤其是当它谈论原始数据如何存储在缓冲区中时)

序列化在我们需要时很有用:

在 JVM 生命周期之外保持状态 - 文件/数据库 通过网络将数据发送到另一个基于 jvm 的应用程序 - 数据交换

文档:https://docs.oracle.com/javase/6/docs/platform/serialization/spec/serial-arch.html

    我一直在使用 Spring/Hibernate,并且在任何应用程序中,模型都定义为可序列化类型。使用 Serializable 的主要原因是未来增强的版本控制,但是如果没有 Serializable,Hibernate 会将数据保留在 DB 中/但使用 ObjectOutputStream 序列化到文件失败。谁能帮我理解一下,为什么 Hibernate 不要求实体是 Serializable 类型?

【问题讨论】:

我对第二个问题找到了一个很好的解释:***.com/a/2726387/10368507 【参考方案1】:

只是我的理解 对于#1 序列化后的对象流基本包括5个部分:

标头声明这是一个序列化文件和序列化版本。 类的信息,如名称、序列化 id(serialVersionUID)、字段数等。 字段说明 父类信息 字段的值。

从 ObjectOutputStream 检查这些代码:

if (obj instanceof String) 
    writeString((String) obj, unshared);
 else if (cl.isArray()) 
    writeArray(obj, desc, unshared);
 else if (obj instanceof Enum) 
    writeEnum((Enum<?>) obj, desc, unshared);
 else if (obj instanceof Serializable) 
    writeOrdinaryObject(obj, desc, unshared);
 else 
if (extendedDebugInfo) 
    throw new NotSerializableException(
    cl.getName() + "\n" + debugInfoStack.toString());
 else 
    throw new NotSerializableException(cl.getName());

对于#2,我认为 hibernate/jpa 只是通过查询将它们写入数据库,它们不需要序列化对象。如果您需要传输然后跨 JVM 或其他用途,您可以使用 Serializable 实现实体(我认为您最好在基于 Web 的应用程序中进行序列化)。

【讨论】:

以上是关于序列化:基本理解和文档的主要内容,如果未能解决你的问题,请参考以下文章

一文带你理解对象流序列化机制

一文带你理解对象流序列化机制

Serializable详解:代码验证Java序列化与反序列化

java理解java对象序列化

java 将服务器上读取到的返回给客户端的方法?

Laravel 5.1 文档攻略 —— Eloquent:模型对象序列化