我想知道对特定类型的任意对象的实例方法的引用是否可序列化?
例:
public class MyClass {
public void foo() {
System.out.println("Serializable");
}
}
Run Code Online (Sandbox Code Playgroud)
SerializableConsumer
@FunctionalInterface
public interface SerializableConsumer<T> extends Consumer<T>, Serializable {
}
Run Code Online (Sandbox Code Playgroud)
和领域是:
SerializableConsumer<MyClass> serializableMethod = MyClass::foo;
Run Code Online (Sandbox Code Playgroud)
EDITED
假设SerializableFunction引用了一个扩展的类型,Serializable方法引用将是可序列化的.您要求的特定类型的方法参考没有什么特别之处.
最值得注意的是,"参考一个任意对象的实例方法"不是捕获的任何实例MyClass,因此,这一事实MyClass并不是Serializable不重要.如果您指的是特定实例的实例方法,例如object::foo,在这种情况下,对象也必须被序列化,如果它的类没有实现,它将在运行时失败,这将是不同的Serializable.
什么是行不通的,是将void方法称为Function返回类型Void.我不知道你SerializableFunction<MyClass, Void>是如何定义的,但如果它是等价的Function<MyClass, Void>&Serializable,它将无法工作.
当您具有适当的功能接口时,序列化方法引用是没有问题的:
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());
}
}
Run Code Online (Sandbox Code Playgroud)
如上所述,对特定实例的引用必须序列化目标实例,因此,取决于该实例的可串行性
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();
}
}
Run Code Online (Sandbox Code Playgroud)
java.io.NotSerializableException: MyClass除非你MyClass改为实现,否则在运行时会失败Serializable.
| 归档时间: |
|
| 查看次数: |
1003 次 |
| 最近记录: |