gpt4 book ai didi

java - Java 是否具有静态反序列化的内置能力或标准模式?

转载 作者:行者123 更新时间:2023-11-30 08:50:58 24 4
gpt4 key购买 nike

序列化作为实例方法是有意义的——一个对象可能合理地能够序列化自身。对象只应处于有效状态,并且对象的所有有效状态都应允许序列化。这个想法没有任何错误。

但是反序列化作为实例方法没有意义。对象状态的任何部分都不应对从数据构建另一个对象的过程产生任何影响。没有这样的类 foo,您需要一个构造的 foo 才能构造一个 foo。

所以我的问题是,标准 java 是否有一组预先存在的接口(interface)/设施来促进静态反序列化?如果您实现基于实例的方法,那么您的反序列化将“正常工作”(就像任何事情一样)与 Java 的默认反序列化能力一起工作。

是否有内置的东西,可以使用类作为该类对象的工厂,从串行数据构造? Java 中是否有任何我可以将类传递给的东西,以便此工具知道调用一些静态方法来反序列化以从其平面形式构造对象?

最佳答案

反序列化实例方法readObject 是私有(private)的。没有办法从外面调用它。您可以从您的一个实例方法中调用它,但这会很奇怪,我会质疑您为什么首先要这样做。你说:

No part of an object's state should have any bearing on the process of constructing another object from data.

是的,但我不明白你为什么认为这是个问题。您无法从外部调用 readObject(除非您从其他一些公共(public)方法调用它,正如我所说,这有点不确定)在您已经创建的实例上。反序列化时,您很可能会使用 ObjectInputStream,它将使用无参数构造函数创建一个新实例,然后使用流中的数据对该对象进行水合(当您调用 ObjectInputStream#readObject)。所以不存在影响反序列化的实例状态的问题,因为你得到的是一个序列化数据创建的实例(作为Object,但你随后将转换它到具体类型)。

实际上,readObject 的行为有点像构造函数,只是它使用先前序列化的数据来创建对象的实例。扩展类比,您的问题没有意义,因为您会问“为什么使用构造函数创建对象与实例的状态有任何关系?”。状态问题甚至不适用,因为您甚至没有实例!同样,状态不会与 readObject 一起发挥作用,因为永远无法* 使用现有 实例反序列化和创建实例。

如果你想更好地控制序列化,你可以在你的类中覆盖 SerializablereadObjectwriteObject 如果你想处理一种特殊的方式。您可以通过实现 Externizable 并为 readExternalwriteExternal 提供实现,更好地控制如何写出数据.

在你的第二个问题中,你想知道调用 readObject 的“东西”是什么。 “某物”是 reflection ; ObjectInputStream 将检查类是否有 readObject 方法。如果您提供了自己的实现,它将调用它。否则它将调用 defaultReadObject(其中包含默认序列化的逻辑)。

就用于反序列化的内置工厂而言,没有任何东西,而且我也没有真正觉得需要什么,因为标准的序列化/反序列化方法似乎运行良好。

如果您想了解更多信息,我建议您查看 serialization specification全面深入地了解 Java 如何处理序列化,特别是 Object Input Classes针对您的特定问题。

*进入状态的唯一方法是如果你做了一些奇怪的事情,比如从其他一些实例方法调用 readObject 方法(它必须接受一个 ObjectInputStream),然后您拥有根据现有实例的状态执行反序列化的自定义逻辑。换句话说,对象的状态对反序列化逻辑有任何影响的唯一方式是您以这种方式显式编写。同样,正如我之前提到的,那将是非常奇怪的代码,有很多警告并且值(value)很小。

关于java - Java 是否具有静态反序列化的内置能力或标准模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30743977/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com