gpt4 book ai didi

java-8 - 在 Java 8 中对实例方法的引用是否可序列化?

转载 作者:行者123 更新时间:2023-12-04 14:55:22 25 4
gpt4 key购买 nike

我想知道对特定类型的任意对象的实例方法的引用是否可序列化?

例子:

public class MyClass {
public void foo() {
System.out.println("Serializable");
}
}

可序列化消费者
@FunctionalInterface
public interface SerializableConsumer<T> extends Consumer<T>, Serializable {
}

和领域是:
SerializableConsumer<MyClass> serializableMethod = MyClass::foo;

已编辑

最佳答案

假设 SerializableFunction指扩展 Serializable 的类型,方法引用将是可序列化的。您要求的特定类型的方法引用没有什么特别之处。

最值得注意的是,“对任意对象的实例方法的引用”并未捕获 MyClass 的任何实例。 ,因此,MyClass不是 Serializable并不重要。如果您指的是特定实例的实例方法,例如 object::foo,情况会有所不同。 ,在那种情况下,对象也必须被序列化,如果它的类没有实现 Serializable,这将在运行时失败。 .

什么不行,请引用 void方法作为 Function返回类型 Void .不知道你的SerializableFunction<MyClass, Void>已定义,但如果它等价于 Function<MyClass, Void>&Serializable , 不起作用。

当你有一个合适的功能接口(interface)时,序列化方法引用是没有问题的:

import java.io.*;
import java.util.function.Consumer;

public class MyClass {
public void foo() {
System.out.println("Serializable");
}
public static void main(String[] args) throws IOException, ClassNotFoundException {
Consumer<MyClass> consumer = (Consumer<MyClass>&Serializable)MyClass::foo;

byte[] serialized;
try(ByteArrayOutputStream baos=new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos)) {
oos.writeObject(consumer);
oos.flush();
serialized=baos.toByteArray();
}

Consumer<MyClass> deserialized;
try(ByteArrayInputStream bais=new ByteArrayInputStream(serialized);
ObjectInputStream ois=new ObjectInputStream(bais)) {
deserialized = (Consumer<MyClass>)ois.readObject();
}

deserialized.accept(new MyClass());
}
}

如前所述,对特定实例的引用必须序列化目标实例,因此,取决于该实例的可序列化性,因此
import java.io.*;
import java.util.function.Consumer;

public class MyClass {
public void foo() {
System.out.println("Serializable");
}
public static void main(String[] args) throws IOException, ClassNotFoundException {
Runnable runnable = (Runnable&Serializable)new MyClass()::foo;

byte[] serialized;
try(ByteArrayOutputStream baos=new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos)) {
oos.writeObject(runnable);
oos.flush();
serialized=baos.toByteArray();
}

Runnable deserialized;
try(ByteArrayInputStream bais=new ByteArrayInputStream(serialized);
ObjectInputStream ois=new ObjectInputStream(bais)) {
deserialized = (Runnable)ois.readObject();
}

deserialized.run();
}
}

将在运行时失败并返回 java.io.NotSerializableException: MyClass , 除非您更改 MyClass实现 Serializable .

关于java-8 - 在 Java 8 中对实例方法的引用是否可序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43805572/

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