草庐IT

SERIALIZATION

全部标签

java - 如何在Java中序列化不可序列化的?

如何序列化不实现Serializable的对象?我无法将它标记为可序列化,因为该类来自第3方库。 最佳答案 你不能序列化一个没有实现Serializable的类,但是你可以把它包装在一个实现的类中。为此,您应该在包装类上实现readObject和writeObject,以便您可以以自定义方式序列化其对象。首先,使您的不可序列化字段transient。在writeObject中,首先在流上调用defaultWriteObject以存储所有非transient字段,然后调用其他方法来序列化不可序列化对象的各个属性.在readObject

java - 如何序列化 Java 类的静态数据成员?

我们序列化对象的时候,静态成员是不序列化的,但是如果需要,有什么办法吗? 最佳答案 第一个问题是为什么需要序列化静态成员?静态成员与类相关联,而不是与实例相关联,因此在序列化实例时包含它们是没有意义的。第一个解决方案是使这些成员不是静态的。或者,如果这些成员在原始类和目标类(相同的类,但可能不同的运行时环境)中相同,则根本不要序列化它们。我对如何跨静态成员发送有一些想法,但我首先需要查看用例,因为在所有情况下都意味着更新目标类,我还没有找到这样做的充分理由. 关于java-如何序列化Ja

java - 如何序列化 Java 类的静态数据成员?

我们序列化对象的时候,静态成员是不序列化的,但是如果需要,有什么办法吗? 最佳答案 第一个问题是为什么需要序列化静态成员?静态成员与类相关联,而不是与实例相关联,因此在序列化实例时包含它们是没有意义的。第一个解决方案是使这些成员不是静态的。或者,如果这些成员在原始类和目标类(相同的类,但可能不同的运行时环境)中相同,则根本不要序列化它们。我对如何跨静态成员发送有一些想法,但我首先需要查看用例,因为在所有情况下都意味着更新目标类,我还没有找到这样做的充分理由. 关于java-如何序列化Ja

java - HashMap 可序列化

HashMap实现了Serializable接口(interface);所以可以序列化。我查看了HashMap的实现,并且Entry[]表被标记为transient。由于Entry[]表是存储Map全部内容的表,如果不能序列化,那么反序列化的时候Map是如何构造回来的 最佳答案 如果您查看thesource您会看到它不依赖默认的序列化机制,而是手动写出所有条目(作为键和值的交替流):/***SavethestateoftheHashMapinstancetoastream(i.e.,*serializeit)**@serialDat

java - HashMap 可序列化

HashMap实现了Serializable接口(interface);所以可以序列化。我查看了HashMap的实现,并且Entry[]表被标记为transient。由于Entry[]表是存储Map全部内容的表,如果不能序列化,那么反序列化的时候Map是如何构造回来的 最佳答案 如果您查看thesource您会看到它不依赖默认的序列化机制,而是手动写出所有条目(作为键和值的交替流):/***SavethestateoftheHashMapinstancetoastream(i.e.,*serializeit)**@serialDat

java - 可以显式删除对 lambda 的序列化支持

作为alreadyknown当目标接口(interface)尚未继承Serializable时,很容易将Serialization支持添加到lambda表达式,就像(TargetInterface&Serializable)()->{/*code*/}.我要求的是一种相反的方法,当目标接口(interface)确实继承Serializable时显式删除序列化支持。由于您无法从类型中删除接口(interface),因此基于语言的解决方案可能看起来像(@NotSerializableTargetInterface)()->{/*code*/}。但据我所知,没有这样的解决方案。(如果我错了,

java - 可以显式删除对 lambda 的序列化支持

作为alreadyknown当目标接口(interface)尚未继承Serializable时,很容易将Serialization支持添加到lambda表达式,就像(TargetInterface&Serializable)()->{/*code*/}.我要求的是一种相反的方法,当目标接口(interface)确实继承Serializable时显式删除序列化支持。由于您无法从类型中删除接口(interface),因此基于语言的解决方案可能看起来像(@NotSerializableTargetInterface)()->{/*code*/}。但据我所知,没有这样的解决方案。(如果我错了,

java - 是否可以在 java 中使用反射创建没有无参数构造函数的类的 'blank' 实例?

我有一个没有默认构造函数的类。我需要一种方法来获取此类的“空白”实例。“空白”表示实例化后所有类字段都应具有默认值比如null、0等。我问是因为我需要能够序列化/反序列化大树对象。而且我无法访问这些对象类的来源,并且类既没有默认构造函数也没有实现可序列化。尝试序列化这种结构可能不是一个好主意,但另一种方法是将其转换为更容易序列化的东西。 最佳答案 使用标准反射,没有,但是有一个库可以为您做到这一点:objenesis.它专门设计用于实例化没有默认构造函数的类,它被其他序列化库使用,如xstream.注意:在这些情况下可能不会调用构造

java - 是否可以在 java 中使用反射创建没有无参数构造函数的类的 'blank' 实例?

我有一个没有默认构造函数的类。我需要一种方法来获取此类的“空白”实例。“空白”表示实例化后所有类字段都应具有默认值比如null、0等。我问是因为我需要能够序列化/反序列化大树对象。而且我无法访问这些对象类的来源,并且类既没有默认构造函数也没有实现可序列化。尝试序列化这种结构可能不是一个好主意,但另一种方法是将其转换为更容易序列化的东西。 最佳答案 使用标准反射,没有,但是有一个库可以为您做到这一点:objenesis.它专门设计用于实例化没有默认构造函数的类,它被其他序列化库使用,如xstream.注意:在这些情况下可能不会调用构造

java - 如果对象被移动到另一个包或重命名,我该如何反序列化?

考虑以下情况:有一个序列化文件,由旧版本的应用程序创建。不幸的是,已序列化的类的包已更改。现在我需要将此文件中的信息加载到同一个类中,但位于不同的包中。此类已定义serialVersionUID且未更改(即兼容)。问题:是否可以使用任何技巧从这个文件加载新的类实例(除了将类复制到旧包中然后使用反序列化包装器逻辑)?可以使用readResolve()从移动/重命名类(class)中恢复?如果不是,请解释原因。 最佳答案 有可能:classHackedObjectInputStreamextendsObjectInputStream{p