2010-02-09 5 views
14

में बाल वर्गों को गैर सीरियलज़ेबल के रूप में बनाना मेरे पास एक कक्षा है जो Serializable लागू करता है। अब मैं इस वर्ग को बढ़ाता हूं और मैं चाहता हूं कि यह विस्तारित कक्षा गैर-सीरियलज़ेबल हो। तो यह कैसे करें?जावा

उदाहरण के लिए। मैं

class A implements Serializable. 

है और मैं

class B extends A. 

है लेकिन मैं वर्ग बी गैर Serializable होना चाहता हूँ।

+2

इस सवाल वास्तव में दृढ़ता के बारे में है? –

+0

यह विशेष रूप से सभी धारावाहिक स्विंग कक्षाओं IMHO के साथ एक समस्या है। जब मैं 'JTable' के लिए 'सारणीबल मॉडल' (धारावाहिक) के उप-वर्ग को पास करता हूं, तो मैं आमतौर पर मॉडल को क्रमबद्ध करने के लिए 'जेटीबल' की अपेक्षा नहीं करता हूं, फिर भी मैं अपनी उप-वर्ग को क्रमबद्ध करने की आवश्यकता से बच नहीं सकता हूं। –

उत्तर

13

के रूप में दूसरों को स्पष्ट कर दी है, यह संभव नहीं एक Serializable वर्ग का एक उपवर्ग के लिए है गैर Serializable हो रहा है।

यदि आप चाहते हैं कि सबक्लास 'विशेषताओं को धारावाहिक नहीं किया जाना है, तो एक विकल्प उन्हें सभी क्षणिक बनाना है।

आपको उससे अधिक की जरूरत है (यदि आप धारावाहिक होने के लिए सुपर वर्ग क्षेत्रों नहीं करना चाहती), writeObject(ObjectOutputStream) ओवरराइड और readObject(ObjectInputStream) के रूप में यहां उनका उल्लेख - https://web.archive.org/web/20120626144013/http://java.sun.com/developer/technicalArticles/ALT/serialization

+1

Sun.com पर लिंक अब मान्य नहीं है। क्या यह वही लेख है? http://www.oracle.com/technetwork/articles/java/javaserial-1536170.html – spaaarky21

+1

@ spaaarky21 नहीं, यह वही लेख नहीं है। मैंने अब archive.org पर लिंक अपडेट कर दिया है। – Nayuki

4

यह वास्तव में संभव नहीं है। आपका सबसे अच्छा शर्त बी समग्र जाने के लिए/ए सजाने

public class B { 
    private A a = new A(); 

    public void doSomething() { 
     a.doSomething(); 
    } 
} 
+0

'बी' को उप-वर्ग होने की आवश्यकता होने पर नहीं किया जा सकता है, उदाहरण के लिए, 'थ्रोबल', 'घटक', या 'एक्शन', जिनमें से सभी Serializable हैं। –

14

आप इंटरफेस नहीं निकाल सकते हैं, लेकिन आप क्रमबद्धता रोका जा सकता है रन-टाइम में:

class B extends A { 
    private void writeObject(ObjectOutputStream oos) throws IOException { 
     throw new NotSerializableException(); 
    } 
} 
+3

इससे कई समस्याएं हो सकती हैं, जब कोई जांचता है कि क्या आप Serializable लागू करते हैं और फिर आपको वास्तव में serializable होने की उम्मीद है। –

+4

यह सूर्य द्वारा अनुशंसित है।Http://java.sun.com/developer/technicalArticles/ALT/serialization/ ("अन्य पॉइंटर्स" शीर्षक वाला पैराग्राफ देखें।) – finnw

3

यह हमेशा, Serializable होना ही आप वर्ग कभी हर सदस्य transient बनाकर धारावाहिक हो जाता है में कुछ भी नहीं सुनिश्चित कर सकता होगा।

1

अपनी टिप्पणी में से एक का जवाब (यह मानते हुए आप जेपीए या हाइबरनेट की बात कर रहे हैं):

लेकिन किसी भी वर्ग है जो अपनी वस्तु चाहता है इस को लागू करना चाहिए कायम किया जाना है। और मैं अपनी कक्षा बी की वस्तुओं को निरंतर के रूप में चाहता हूं।

यदि आप नहीं चाहते हैं कि बी लगातार बने रहें, तो इसे @Entity के रूप में चिह्नित न करें। लेकिन बी को विस्तारित करने के लिए यह वास्तव में समझ में नहीं आता है अगर बी एक सतत इकाई IMHO नहीं है। यह विरासत का बुरा उपयोग होगा।

0

readObject() और writeObject implememnt करने की आवश्यकता() तरीके

+0

आपको अपना उत्तर जोड़ने से पहले प्रस्तावित पिछले समाधानों को पढ़ना होगा, इस मामले में, आपका पहले से ही प्रस्तावित किया गया है और [स्वीकार किया गया] (https://stackoverflow.com/a/2229256/1387113) @ जैक लियो द्वारा! – hd84335