、メソッド参照は、シリアライズされます。あなたが求めている特定のタイプのメソッド参照について特別なことは何もありません。
「任意のオブジェクトのインスタンスメソッドへの参照」は、MyClass
のインスタンスを取得していないため、MyClass
がSerializable
ではないことは重要ではありません。 object::foo
のような特定のインスタンスのインスタンスメソッドを参照している場合は、オブジェクトが直列化されている必要があります。実行時にクラスが実装されていないとSerializable
が失敗します。
void
メソッドを返品タイプVoid
のFunction
として参照することはできません。私はあなたの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());
}
}
としては、特定のインスタンスへの参照は、その直列化に依存し、したがって、ターゲット・インスタンスをシリアル化する必要があり、前記たとえば、あなたがSerializable
を実装するために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
と、実行時に失敗します。
なぜ特定のタイプのメソッドリファレンスについて質問していますか?他のメソッド参照やラムダ式と比較して特別だと思いますか? – Holger
私はあなたの質問が思考のための良い資料だと信じています。しかし、私はあなたのユースケースに興味があります...なぜメソッド参照をシリアル化する必要がありますか? –
会話スコープのあるCDI Beanのフィールドです。したがって、直列化可能でなければなりません。 – Saljack