java.io.NotSerializableException, даже если я реализую «Сериализуемый» - PullRequest
5 голосов
/ 22 ноября 2011

У меня небольшая проблема: я хотел протестировать сериализацию на Android (используя eclipse) и нашел пример, как это сделать.Я знаю, что мне нужно реализовать «Сериализуемый» в классе, который я хочу сериализовать, я уже сделал это и всегда получаю исключение java.io.NotSerializableException.Вот код:

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;

Ответы [ 7 ]

8 голосов
/ 22 ноября 2011

Хорошо, ваш сериализуемый объект имеет какие-либо ссылки на другие несериализуемые объекты?Если так, то java.io.NotSerializableException будет брошено из-за этого.Чтобы иметь возможность сериализации, вы должны иметь свой класс реализации Serializable И все зависимости, которые у него есть, типа Serializable (то есть, реализовать Serializable).

Сообщение об исключении должно сообщать вам, если такоесуществует несериализуемая зависимость:

Должно быть что-то вроде «java.io.NotSerializableException: NonSerializableClassName»

Обновление: согласно комментарию Божо, я не заметил, что на самом деле ваш классне иметь несериализуемых зависимостей.

6 голосов
/ 22 ноября 2011

Единственное, о чем я могу думать, это то, что классы, которые вы используете, не те, которые вы написали - например, вы не скомпилировали более новую версию.

Я не могу воспроизвести проблему с помощью простой Java-программы.

Первоначально я думал, что вы, возможно, реализовали sunw.io.Serializable вместо java.io.Serializable, но он расширяет класс io, поэтому он должен работать даже с ним.

4 голосов
/ 25 января 2013

Я получил ответ по ссылке ниже, хотя я не могу понять все это. почему этот простой сериализуемый объект генерирует исключение NotSerializableException? Поскольку ваш внутренний класс не является статическим, поэтому для его существования в качестве сериализованного объекта ему потребуется экземпляр внешнего класса, а действие не сериализуемо. Сделайте Tester отдельным классом или сделайте его статическим внутренним классом.

2 голосов
/ 22 июня 2014

Старый вопрос, но я бы добавил свое решение, потому что у меня недавно была похожая проблема.

Решение, убедитесь, что ваш класс ser не является вложенным классом. Встроенная Java-сериализация без ошибок завершилась бы, если бы ваш класс был вложен в не реализованный сериализованный родительский класс.

Итак, переместите реализацию класса ser в свой собственный файл ser.java, и сериализация теперь должна работать.

2 голосов
/ 21 декабря 2011

Из вашего кода не понятно. Но если вы определили «ser» как внутренний класс какого-то другого не серилизуемого класса (в вашем случае, вероятно, это «Activity», который не серилизуем), то либо определите этот родительский класс также как сериализуемый, либо не определите «ser» как внутренний класс.

Сериализация внутренних классов (т. Е. Вложенных классов, которые не являются статическими классами-членами), включая локальные и анонимные классы, настоятельно не рекомендуется по нескольким причинам.

0 голосов
/ 29 октября 2016

Я знаю, что немного опоздал, но заметил, что у вас нет serialVersionUID, что-то вроде 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;
}

Еще раз, я немного опоздал, но этот вопрос имеет тысячи просмотров, и вы не выбрали ответ, так что, возможно, это кому-нибудь поможет.

0 голосов
/ 22 мая 2015

Я сломал голову с этим. Проблема, с которой столкнулся мой код, заключалась в том, что я не удалял свой файл .ser до того, как написал новый объект. Моя цель - написать (сериализовать) ArrayList мест и десериализовать их. Это я делаю, когда получаю новое место. Поскольку я не мог добавить объекты, которые я выбрал для написания полного Списка, мне приходится каждый раз удалять файл .ser перед тем, как писать новый Список. Ошибка, которую он показывает, не указывала на фактическую проблему. Сделайте ваш -ser свежим и чистым, прежде чем что-то писать в него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...