序列化:基本理解和文档
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 的应用程序中进行序列化)。
【讨论】:
以上是关于序列化:基本理解和文档的主要内容,如果未能解决你的问题,请参考以下文章