Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java是否具有用于静态反序列化的内置功能或标准模式?_Java_Deserialization_Standards - Fatal编程技术网

Java是否具有用于静态反序列化的内置功能或标准模式?

Java是否具有用于静态反序列化的内置功能或标准模式?,java,deserialization,standards,Java,Deserialization,Standards,序列化作为一种实例方法是有意义的——对象可以合理地序列化自身。对象应始终处于有效状态,并且应允许序列化对象的所有有效状态。这个想法没有什么不妥之处 但反序列化作为实例方法没有意义。对象状态的任何部分都不应与从数据构造另一对象的过程有任何关系。没有类foo,因此需要构造foo才能构造foo 所以我的问题是,标准java是否有一组预先存在的接口/设施来促进静态反序列化?如果您实现了基于实例的方法,那么反序列化“只适用于”(与任何东西一样)任何使用Java默认反序列化功能的东西 是否有内置的东西,使用

序列化作为一种实例方法是有意义的——对象可以合理地序列化自身。对象应始终处于有效状态,并且应允许序列化对象的所有有效状态。这个想法没有什么不妥之处

但反序列化作为实例方法没有意义。对象状态的任何部分都不应与从数据构造另一对象的过程有任何关系。没有类foo,因此需要构造foo才能构造foo

所以我的问题是,标准java是否有一组预先存在的接口/设施来促进静态反序列化?如果您实现了基于实例的方法,那么反序列化“只适用于”(与任何东西一样)任何使用Java默认反序列化功能的东西


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

反序列化实例方法
readObject
是私有的。没有办法从外面称呼它。你可以从你的一个实例方法中调用它,但那会很奇怪,我想问你为什么要这么做。你说:

对象状态的任何部分都不应与从数据构造另一个对象的过程有任何关系

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

实际上,
readObject
的行为有点像构造函数,只是它使用以前序列化的数据来创建对象的实例。扩展类比,您的问题没有意义,因为您会问“为什么使用构造函数创建对象与实例的状态有关?”。国家的问题甚至不适用,因为你甚至没有一个实例!类似地,state不会在
readObject
中起作用,因为它永远不能*反序列化并使用现有实例创建实例

如果您想更好地控制序列化,如果您想以特殊方式处理事情,可以在类中重写
Serializable
中的
readObject
writeObject
。通过实现
Externizable
并提供
readExternal
writeExternal
的实现,您可以更好地控制数据的写入方式

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

至于反序列化的内置工厂,没有任何东西,而且我也没有真正感觉到需要一些东西,因为标准的序列化/反序列化方法似乎工作得很好

如果您想了解更多有关这方面的信息,我建议您查看,以全面深入地了解Java如何处理序列化,特别是针对您的特定问题


*进入状态的唯一方法是,如果您执行了一些奇怪的操作,例如从其他实例方法调用
readObject
方法(必须接受
ObjectInputStream
),然后您拥有根据现有实例的状态执行反序列化的自定义逻辑。换句话说,对象的状态对反序列化逻辑有任何影响的唯一方式是以这种方式显式编写。同样,正如我前面提到的,这将是非常奇怪的代码,有大量的警告和最小的价值。

您看过Java的
ObjectInputStream
类吗?这是反序列化Java对象的常用(内置)方式,并且它不需要反序列化类的预先存在的实例(正如您所期望的)。也许我对Java如何处理序列化感到困惑。所以,如果您希望类是可序列化的,那么就实现可序列化的,对吗?您可以通过实现readObject和writeObject对其进行自定义。java中的某些东西知道如何调用这些实例方法。我想知道的是:Java中是否有什么东西可以从类Foo调用“static Foo readObject”?@SaburoutaMishima是的,这是通过Java运行时完成的。您可以找到有关此主题的更多信息。好的测量方法:举个例子。不清楚你在问什么。在构造类的空白实例后,将调用
readObject()
方法来填充它。您可能不喜欢它是非静态的,但运气不好。不过,对于任何新对象,最好使用用户定义的构造函数。我认为
readObject
writeObject
的吸引力在于序列化API最终非常正交。另一个选择是