2016-11-08 9 views
5

चलो कहते हैं कि मैं एक Serializable इंटरफ़ेस के रूप में इस प्रकार हैक्या जावा सीरियलज़ेबल इंटरफ़ेस में उपयोग किए जाने पर स्वचालित रूप से सीरियलज़ेबल कक्षाएं बनाता है?

public interface SomeInterface extends Serializable { 

    public SomeClass getSomething(String someParameter); 

} 

SomeClass स्वचालित रूप से Serializable हो जाएगा करते हैं? हमारे आश्चर्य करने के लिए, हमारे RMI आवेदन भी जब SomeClass Serializable को लागू नहीं करता है ठीक चलाता है।

यह क्यों है?

+0

केवल वर्ग जो Serializable (या उप-वर्ग) चिह्नित कर रहे हैं Serializable हैं। सबसे अधिक संभावना 'SomeClass' कुछ serializable या बाह्यकरण लागू या लागू करता है। –

+0

या वापस लौटाया जा रहा है 'SomeClass', या शून्य के एक serializable व्युत्पन्न वर्ग है। – EJP

+0

इंटरफेस लागू किए गए हैं, कक्षाएं विस्तारित हैं। सीरियलज़ेबल एक वर्ग है जो किसी उप-वर्ग को क्रमबद्ध करने के लिए प्रतिबिंब का उपयोग करता है। ध्यान दें कि यह आमतौर पर जटिल उप-वर्गों के लिए बहुत अक्षम है - यह सबकुछ क्रमबद्ध करता है। अधिक कुशल मार्शलिंग के लिए प्रोटोबफ या बाहरी उपयोग करें। –

उत्तर

2

SomeClassSerializable स्वचालित रूप से होगा? हमारे आश्चर्य करने के लिए, हमारे RMI आवेदन भी जब SomeClassSerializable को लागू नहीं करता है ठीक चलाता है।

सं

क्रमबद्धता (गैर क्षणिक) एक वस्तु का राज्य serializing के बारे में है। कुछ विधि के हस्ताक्षर में एक getSomething की उपस्थिति नहीं है एक SomeInterface के अपने उदाहरण के राज्य की आवश्यकता होती है एक SomeClass उदाहरण शामिल करने के लिए।

विधि वापस जाने के लिए एक नव SomeClass बनाया लागू किया जा सकता है, एक transient फ़ील्ड का मान, कुछ अन्य वर्ग, या .... null पर एक static विधि बुला का परिणाम है।

-1

नहीं, SomeClassSerializable नहीं होगा क्योंकि यह इंटरफ़ेस Serializable फैलाता है।

Serializable ऑब्जेक्ट की स्थिति पर लागू होता है, तो यह कुछ भी नहीं है कि कुछ क्लास कुछ इंटरफेस की स्थिति का हिस्सा है। https://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html

आप पर मुकदमा कर रहे हैं कि जब SomeClass deserialized की जा रही है कि यह एक वर्ग है कि Serializable लागू करता विस्तार नहीं करता है?

+0

'Serializable' मुख्य रूप से कक्षा की परिभाषा पर लागू होता है। यदि 'SomeClass' 'Serializable' नहीं है, तो यह कभी भी * धारावाहिक * नहीं होगा, इसलिए * de * -serialization – EJP

-1

मान लीजिए SomeInterface के एक कार्यान्वयन सिर्फ

public class SomeInterfaceImpl implements SomeInterface { 

    @Override 
    public SomeClass getSomething(String someParameter) { 
     return new SomeClass(someParameter); 
    } 
} 

क्यों अपने कार्यक्रम को विफल करना चाहिए के समान SomeInterfaceImpl की वस्तुओं serializing जब SomeClass की वस्तुओं बस मक्खी पर बनाई गई हैं पर कुछ करता है?

मिनिमल उदाहरण

Main.java

import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class Main { 

    public static void main(String[] args) { 

     try (final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
       final ObjectOutputStream out = new ObjectOutputStream(byteArrayOutputStream)) { 
      final SomeInterfaceImpl someInterfaceImpl = new SomeInterfaceImpl(); 
      final SomeClass something1 = someInterfaceImpl.getSomething("Test"); 
      out.writeObject(someInterfaceImpl); 

      try (final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray()); 
        final ObjectInputStream in = new ObjectInputStream(byteArrayInputStream)) { 
       final SomeInterface someInterface = (SomeInterface) in.readObject(); 
       final SomeClass something2 = someInterface.getSomething("Test"); 

       final String someParameter1 = something1.getSomeParameter(); 
       System.out.println(someParameter1); 

       final String someParameter2 = something2.getSomeParameter(); 
       System.out.println(someParameter2); 
      } catch (ClassNotFoundException ex) { 
       Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } catch (IOException ex) { 
      Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 
+0

के दौरान क्या होता है इसके बारे में प्रश्न पूछना निष्क्रिय नहीं है क्या आपने वास्तव में इसे आजमाया है? संदेह में, मैंने सफलतापूर्वक क्रमबद्ध करने और deserializing एक न्यूनतम उदाहरण जोड़ा है। – Smutje

0

नहीं, बस एक वर्ग है कि serializable है भीतर संदर्भित किसी भी वर्ग डिफ़ॉल्ट रूप से serializable नहीं है।

आदर्श रूप में javaNotSerializableExceptionSomeClassextends Serializable फेंक चाहिए, लेकिन जब से तुम अपवाद नहीं मिल रहा है इसका मतलब है, यह माता पिता के पदानुक्रम है द्वारा कहीं।

+0

या यह शून्य था, या एक धारावाहिक व्युत्पन्न वर्ग का एक उदाहरण था। – EJP

संबंधित मुद्दे