क्यों लिखते हैं ।Oject को java.io.NotSerializableException को फेंक दें और मैं इसे कैसे ठीक करूं?


110

मेरे पास यह अपवाद है और मुझे समझ नहीं आ रहा है कि इसे क्यों फेंका जाएगा या, मुझे इसे कैसे संभालना चाहिए।

try {
    os.writeObject(element);
} catch (IOException e) {
    e.printStackTrace();
}

कक्षा एटम के कुछ अन्य उदाहरणों से युक्त कहां elementहै :TransformGroupTransformGroups

public class Atom extends Group implements Serializable{
    float pozX,pozY;
    Group group= new Group();   
    Color3f blue = new Color3f(new Color(255));
    Color3f black = new Color3f(new Color(0));
    Sphere AtSph=new Sphere();

    public Atom(final float WEIGHT, final int BOUNDS,final float radius,Color3f color)
    {
        AppSetting ap= new AppSetting(color, black);
        AtSph=new Sphere(radius,1,100,ap);
    }
}

पूर्ण त्रुटि लॉग:

java.io.NotSerializableException: javax.media.j3d.TransformGroup
    at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    at java.io.ObjectOutputStream.writeObject(Unknown Source)
    at cls.MolecularBuilder.addAtom(MolecularBuilder.java:511)
    at cls.MolecularBuilder$Console.HidrogenItemActionPerformed(MolecularBuilder.java:897)
    at cls.MolecularBuilder$Console$2.actionPerformed(MolecularBuilder.java:746)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.AbstractButton.doClick(Unknown Source)
    at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
    at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$200(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

AppSetting (एटम क्लास में) सिर्फ एक कस्टम क्लास है जो अपीयरेंस को बढ़ाता है।


4
ऐसा लगता है कि javax.media.j3d.TransformGroupधारावाहिक पर अमल नहीं होता है
micha

Atomदोनों का विस्तार Groupऔर Groupसदस्य क्यों है ?
को लोर्ने

जवाबों:


210

आपकी वस्तु के क्षेत्र उनके क्षेत्रों को बदल देते हैं, जिनमें से कुछ कार्यान्वित नहीं होते हैं Serializable। आपके मामले में आपत्तिजनक वर्ग है TransformGroup। इसे कैसे हल करें?

  • यदि वर्ग तुम्हारा है, तो बनाओ Serializable
  • यदि वर्ग 3rd पार्टी है, लेकिन आपको क्रमबद्ध रूप में इसकी आवश्यकता नहीं है, तो फ़ील्ड को चिह्नित करें transient
  • यदि आपको इसके डेटा की आवश्यकता है और यह तृतीय पक्ष है, तो क्रमांकन के अन्य साधनों पर विचार करें, जैसे JSON, XML, BSON, MessagePack , आदि जहां आप अपनी परिभाषाओं को संशोधित किए बिना 3 पार्टी ऑब्जेक्ट्स को क्रमबद्ध कर सकते हैं।

2
खैर, बहुत बहुत धन्यवाद, यह करना काफी कठिन काम होगा, क्योंकि मेरी वस्तुएं केवल ट्रांसफॉर्मग्रुप के हिस्से के रूप में मौजूद हैं, और कोई भी चर नहीं हैं जो उन्हें स्टोर करते हैं। मेरा ऐप एक 3D अणु बिल्डर है, और मेरे सभी परमाणु और सीमाएँ केवल ट्रांसफ़ॉर्मग्रुप में इंस्टेंस के रूप में जोड़े जाते हैं- जैसे (नया एटम ())। समस्या केवल यह नहीं है कि मुझे उन्हें एक फ़ाइल में लिखने की आवश्यकता है, लेकिन उपयोगकर्ता वर्तमान वस्तुओं को निकालना या संपादित करना चाह सकता है। मुझे लगता है कि मैं कुछ XML-आधारित क्रमांकन की कोशिश करूंगा, लेकिन मैं अवधारणा के लिए काफी नया हूं और यह मेरे लिए थोड़ा कठिन है। धन्यवाद
मिहाई Bujanca

15
इस उत्कृष्ट जवाब देने के लिए जोड़ने के लिए: आप अपने डेटा और यह तीसरे पक्ष की जरूरत है, तो आप अपने ही वर्ग है, जो औजार में तीसरे पक्ष के वर्ग रैप करने के लिए चाहते हो सकता है Serializableऔर का उपयोग करता है readObject()और writeObject()मैन्युअल रूप से करने के लिए तीसरे पक्ष के वर्ग के डेटा को क्रमानुसार। कुछ मामलों में यह एक उचित दृष्टिकोण हो सकता है। stackoverflow.com/a/12963580/1208581
sulai

76

java.io.NotSerializableExceptionतब हो सकता है जब आप एक आंतरिक श्रेणी का उदाहरण देते हैं क्योंकि:

इस तरह के आंतरिक वर्ग को क्रमबद्ध करने के परिणामस्वरूप इसके संबद्ध बाहरी वर्ग के उदाहरण के रूप में अच्छी तरह से क्रमबद्ध हो जाएगा

स्थानीय और अनाम वर्गों सहित आंतरिक कक्षाओं (यानी, नेस्टेड क्लास जो स्थिर सदस्य वर्ग नहीं हैं) का सीरियलाइजेशन दृढ़ता से हतोत्साहित किया जाता है

संदर्भ: सीरियल इंटरफ़ेस


5
यह मेरे लिए मामला था। यह तब हो रहा था जब मैंने एक यूनिट टेस्ट में शॉर्ट कट लिया। आशा है कि यह उत्तर किसी और को कुछ समय बचाता है।
user489041

मेरे पास एक फ़ील्ड निजी अंतिम सेट था <क्लेम्सनोड> आउटगोइंग = नया ट्रीसेट <क्लेम्सनोड> (नया तुलनित्र <क्लेम्सनोड>) {सार्वजनिक int तुलना (क्लेम्सनोड o1, क्लेम्सनोड o2, {o o.getNativeIndex () - o2.getNativeIndex (); }});
विटाली सज़ानोविच

1
कमाल है, सचमुच मैं पिछले 1 घंटे से इसमें था। मुझे शक होने लगा कि कहीं आदिम चीटियाँ सिलसिलेवार तो नहीं हैं और फिर मेरे साथ ऐसा हुआ कि शायद यहाँ कुछ गड़बड़ है।
शिवम पोखरियाल

13

इंटरफ़ेस लागू करके कक्षा को क्रमबद्ध बनाएं java.io.Serializable

  • java.io.Serializable - मार्कर इंटरफ़ेस जिसका कोई तरीका नहीं है।
  • मार्कर इंटरफ़ेस का उद्देश्य - यह बताने के लिए ObjectOutputStreamकि यह ऑब्जेक्ट एक सीरियल करने योग्य ऑब्जेक्ट है।

7
आप सवाल पढ़ सकते हैं, इसके पहले से ही लागू सीरियल। फिर भी 12+ मुझे विस्मित करते हैं।
शैलू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.