2011-11-22 21 views
5

लागू करता हूं, तो मुझे थोड़ा समस्या है: मैं एंड्रॉइड (ग्रहण का उपयोग करके) पर क्रमबद्धता का परीक्षण करना चाहता था और उदाहरण के लिए यह कैसे पाया गया। मुझे पता है कि मुझे कक्षा में "सीरियलज़ेबल" लागू करने की आवश्यकता है जिसे मैं धारावाहिक बनाना चाहता हूं, मैंने पहले ही ऐसा किया है और हमेशा java.io.NotSerializableException अपवाद प्राप्त करता है।java.io.NotSerializableException अगर मैं "Serializable"

public void Button(View view) throws IOException, ClassNotFoundException { 
ser test = new ser(); 
    test.x = 204; 
    test.y = 2843; 
    test.speed = 12; 
    test.direction = 1343; 
    test.a = 493; 
    test.b = 2323; 
    test.c = 29489; 
    test.d = 394; 

    byte[] arr = serialize(test); 

    ser res = (ser) deserialize(arr); 
} 


public static byte[] serialize(Object o) { 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    try { 
     ObjectOutput out = new ObjectOutputStream(bos);  
     out.writeObject(o);          //This is where the Exception occurs 
     out.close();  
     // Get the bytes of the serialized object  
     byte[] buf = bos.toByteArray(); 
     return buf;  
    } catch(IOException ioe) { 
     Log.e("serializeObject", "error", ioe);   //"ioe" says java.io.NotSerializableException exception 
     return null; 
    } 

} 


public static Object deserialize(byte[] b) { 
     try {  
      ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(b));  
      Object object = in.readObject();  
      in.close(); 
      return object; 
     } catch(ClassNotFoundException cnfe) { 
      Log.e("deserializeObject", "class not found error", cnfe); 
      return null; 
     } catch(IOException ioe) { 
      Log.e("deserializeObject", "io error", ioe);  
      return null; 
     } 
    } 

class ser implements Serializable { 
    float x, y, speed, direction, a, b, c, d; 
} 

मुझे आशा है कि आप मेरी मदद कर सकते हैं, मैं क्या मैं गलत किया था पता नहीं है ...

संपादित करें:: कोड यह मेरी आयात कर रहे हैं:

import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutput; 
import java.io.ObjectOutputStream; 
import java.io.Serializable; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.TextView; 
+0

एंड्रॉइड पार्ससेलबल्स में देखें, शायद यह आप वास्तव में उपयोग करना चाहते हैं। – blindstuff

+0

जैसा कि उत्तर दिया गया है/नीचे टिप्पणी की गई है, 'बटन (शून्य)' को कॉल करने की अपेक्षा की जा रही है: कोई अपवाद नहीं है और 'res' में सही मान प्राप्त हो रहा है। पर्यावरण होना चाहिए ... –

+0

आप इसका परीक्षण कैसे कर रहे हैं? क्या आप एमुलेटर का उपयोग करते हैं, क्या आप एक वास्तविक डिवाइस पर तैनात हैं? आप एमुलेटर/एंड्रॉइड का किस संस्करण का उपयोग कर रहे हैं? विभिन्न एंड्रॉइड अवतारों (जैसे साइनोजन बनाम स्टॉक एंड्रॉइड इत्यादि) के बीच मतभेद हैं। –

उत्तर

6

केवल एक चीज है मैं सोच सकता हूं कि आपके द्वारा चलाए जा रहे वर्ग वे नहीं हैं जिन्हें आपने लिखा है - उदाहरण के लिए आपने नए संस्करण को संकलित नहीं किया है।

मैं एक साधारण जावा प्रोग्राम के साथ समस्या को पुन: उत्पन्न नहीं कर सकता।

प्रारंभ में मैंने सोचा था कि आपने को java.io.Serializable के बजाय लागू किया हो सकता है, लेकिन यह आईओ क्लास को बढ़ाता है, इसलिए इसे इसके साथ भी काम करना चाहिए।

+0

+1 यह एक अच्छा बिंदु है, एक से अधिक Serializable इंटरफ़ेस है। –

+0

यह sunw.io दिखाई देता है। Serializable java.io.Serializable फैलाता है, इसलिए मैं उस बिंदु को संपादित कर रहा हूं – Bozho

+0

यह काम करता है (और उस सीरियलज़ेबल्स में से किसी एक के साथ)। –

7

ठीक है, क्या आपके धारावाहिक वस्तु के अन्य गैर-धारावाहिक वस्तुओं के लिए कोई संदर्भ है? यदि ऐसा है तो java.io.NotSerializableException उस के कारण फेंक दिया जाएगा। क्रमबद्ध करने में सक्षम होने के लिए आपके पास अपनी कक्षा लागू होनी चाहिए Serializable और सभी निर्भरताओं के प्रकार Serializable (यानी Serializable लागू करें) के प्रकार के साथ होना चाहिए।

अपवाद संदेश आपको बताना चाहिए अगर इस तरह के एक गैर serializable निर्भरता मौजूद हैं:

यह कहना चाहिए की तरह कुछ "java.io.NotSerializableException: NonSerializableClassName"

अद्यतन: Bozho की टिप्पणी के अनुसार, मैं नहीं था ध्यान दें कि वास्तव में आपकी कक्षा में कोई गैर-धारावाहिक निर्भरता नहीं है।

+0

वह केवल तैरता है वहाँ – Bozho

+0

हां, मेरा बुरा, मैंने नीचे तक सभी तरह से स्क्रॉल नहीं किया, यह नहीं देखा कि "सेर" कक्षा भी वहां है। मैं इसे प्रतिबिंबित करने के लिए अपना उत्तर अपडेट करूंगा। –

+0

या कक्षा को क्रमबद्ध करने का कोई और तरीका है? सभी मुझे क्या करना ब्लूटूथ के साथ इस तरह एक वर्ग भेज रहा है चाहते हैं और यह केवल अनुमति देता है बाइट सरणियों ... – user1059863

2

अपने कोड से यह स्पष्ट नहीं है। लेकिन अगर आपने कुछ अन्य गैर-सीरिजिज़ेबल क्लास की आंतरिक कक्षा के रूप में "सेर" को परिभाषित किया है (आपके मामले में शायद यह "गतिविधि" है जो serilizable नहीं है) तो या तो उस मूल वर्ग को धारावाहिक के रूप में परिभाषित करें या "ser" को परिभाषित न करें आंतरिक वर्ग

Serialization of inner classes (i.e., nested classes that are not static member classes), including local and anonymous classes, is strongly discouraged for several reasons.

3

मैं लिंक नीचे से जवाब मिल गया है, भले ही मैं पूरी बात नहीं समझ सकता। why does this simple serializable object throw NotSerializableException? कारण बनें कि आपकी आंतरिक कक्षा स्थिर नहीं है, इसलिए धारावाहिक चीज़ के रूप में मौजूद होने के लिए, इसे बाहरी वर्ग के उदाहरण की आवश्यकता होगी और एक गतिविधि धारावाहिक नहीं है। परीक्षक को एक अलग वर्ग बनाएं या इसे एक स्थिर आंतरिक वर्ग बनाएं।

0

पुराना सवाल, लेकिन मेरा समाधान जोड़ देगा क्योंकि मुझे हाल ही में एक ही समस्या थी।

समाधान, सुनिश्चित करें कि आपकी कक्षा ser एक नेस्टेड क्लास नहीं है। जावा धारावाहिक में निर्मित त्रुटि के बिना विफल हो जाएगा यदि आपकी कक्षा गैर-कार्यान्वित-क्रमबद्ध अभिभावक वर्ग में घोंसला है।

तो ser कक्षा कार्यान्वयन को अपनी फ़ाइल ser.java पर ले जाएं और क्रमबद्धता अब काम करनी चाहिए।

0

मैंने इसके साथ अपना सिर तोड़ दिया। मेरा कोड जारी करना था कि मैं नई ऑब्जेक्ट लिखने से पहले अपनी .ser फ़ाइल को हटा नहीं रहा था। मेरा उद्देश्य स्थानों के ArrayList (serialize) लिखना और उन्हें deserialize है। जब मैं नया स्थान प्राप्त करता हूं तो यह करता है। चूंकि मैं ऑब्जेक्ट्स को जोड़ नहीं सकता था, मैंने पूरी सूची लिखने के लिए चुना है, इसलिए मुझे नई सूची लिखने से पहले हर बार .ser फ़ाइल को हटाना होगा। त्रुटि यह दिखाती है कि वास्तविक समस्या को इंगित नहीं किया जा रहा था। इससे पहले कि आप इसे लिखने से पहले अपने -सर को ताज़ा और साफ करें।

0

मुझे पता है कि मुझे थोड़ा देर हो चुकी है, लेकिन मैंने देखा है कि आपके पास कक्षा के शीर्ष पर private static final long serialVersionUID = 7536482295622776147L; जैसे कुछ भी नहीं है (हालांकि यह कोई फर्क नहीं पड़ता है, यह मदद कर सकता है) अपने चर को अलग करने का प्रयास करें है, तो:

class ser implements Serializable { 
    private static final long serialVersionUID = 7536482295622776147L; 
    float x; 
    float y; 
    float speed; 
    float direction; 
    float a; 
    float b; 
    float c; 
    float d; 
} 

एक बार फिर, मैं एक छोटे से देर हो रही है, लेकिन इस सवाल हज़ारों बार है, और आप एक जवाब नहीं चुनी है, तो हो सकता है यह किसी को मदद मिलेगी।

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