यह मानते हुए कि SerializableFunction
एक प्रकार है कि Serializable
फैली को संदर्भित करता है, विधि संदर्भ serializable हो जाएगा। आपके द्वारा पूछे जा रहे विशिष्ट प्रकार के विधि संदर्भ के बारे में कुछ खास नहीं है।
सबसे विशेष रूप से, "एक मनमाना वस्तु का एक उदाहरण विधि के संदर्भ में" MyClass
के किसी भी मामले पर कब्जा नहीं कर रहा है, इसलिए, तथ्य यह है कि MyClass
Serializable
नहीं है नहीं महत्वपूर्ण है। यदि आप object::foo
जैसे किसी विशेष उदाहरण की एक उदाहरण विधि का जिक्र कर रहे थे, तो यह अलग होगा, क्योंकि उस स्थिति में ऑब्जेक्ट को क्रमबद्ध किया जाना था, जो रनटाइम पर विफल हो जाएगा, अगर इसकी कक्षा Serializable
लागू नहीं करती है।
काम नहीं करेगा, void
विधि को के रूप में 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());
}
}
के रूप में कहा, एक विशिष्ट उदाहरण के लिए संदर्भ, लक्ष्य उदाहरण क्रमानुसार करने के लिए है, इसलिए इस बात का serializability पर निर्भर करते हैं:
आप एक उचित कार्यात्मक इंटरफ़ेस है, तो विधि संदर्भ serializing कोई समस्या नहीं है उदाहरण तो
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
लागू करने के लिए होगा।
आप उस विशेष प्रकार के विधि संदर्भ के बारे में क्यों पूछ रहे हैं? क्या आपको लगता है, यह अन्य विधि संदर्भों या लैम्ब्डा अभिव्यक्तियों की तुलना में विशेष है? – Holger
मेरा मानना है कि आपका प्रश्न विचार के लिए अच्छी सामग्री है, इसलिए मैंने इसे ऊपर उठाया। हालांकि, मैं आपके उपयोग के मामले के बारे में उत्सुक हूं ... आपको विधि संदर्भ को क्रमबद्ध करने की आवश्यकता क्यों है? –
यह वार्तालाप के दायरे के साथ सीडीआई बीन का क्षेत्र है। तो यह serializable होना चाहिए। – Saljack