Klonowanie obiektów i NotSerializableException

0

Próbuję klonować obiekty metodą:

Object klonuj(){
        Object ret = null;
        
        try{
            ByteArrayOutputStream bwy = new ByteArrayOutputStream();
            ObjectOutputStream wy = new ObjectOutputStream(bwy);
            wy.writeObject(this);
            wy.close();

            ByteArrayInputStream bwe = new ByteArrayInputStream(bwy.toByteArray());
            ObjectInputStream we = new ObjectInputStream(bwe);
            ret = (ReprezentacjaBloku)we.readObject();
            we.close();
        }catch(Exception e){
            e.printStackTrace();
        }
        return ret;
}

Bo ta metoda, w przeciwieństwie do standardowej, wydaje się się jeszcze dosyć praktyczna. Niestety, częstym problemem jest błąd NotSerializableException występujący w trakcie próby klonowania, który sygnalizuje, jak rozumiem, że typ któregoś z pól klonowanej klasy nie implementuje interfejsu Serializable. Czy nie wie ktoś może, czy istnieje jakiś sposób, żeby sprawdzić, który podobiekt jest przyczyną błędu? Bo poza komunikatem błędu i zawiłym stack trace nie otrzymuję żadnych szczegółowych informacji :(.

0

jedyne co mi przychodzi na myśl tak na szybko to refleksjami zobaczyć, ale to pewnie trochę roboty będzie

http://java.sun.com/javase/6/docs/api/java/lang/Class.html#getSuperclass()
Ogólnie to nie wiem czy takie kopiowanie ma zawsze sens. Na przykład dla gniazdek sieciowych, uchwytów do zasobów itp.

0

Zeby implementowac ObjectOutputStream musisz zaimplementowac interfejs Serializable

0

W wyjątku masz napisane o jaką klasę chodzi.

Jeżeli dostajesz komunikat, np.

java.io.NotSerializableException: ----> ReprezentacjaBloku <----
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)
        ....

Znaczy to, że klasa ReprezentacjaBloku nie implementuje Serializable, a powinna.

btw. Można z tego łatwo zrobić metodę generyczną w klasie z utilsami.

public class CloneUtil {

    public static <T> T klonuj(T o) throws IOException, ClassNotFoundException{
        T ret = null;

        try{
            ByteArrayOutputStream bwy = new ByteArrayOutputStream();
            ObjectOutputStream wy = new ObjectOutputStream(bwy);
            wy.writeObject(o);
            wy.close();

            ByteArrayInputStream bwe = new ByteArrayInputStream(bwy.toByteArray());
            ObjectInputStream we = new ObjectInputStream(bwe);
            ret = (T) we.readObject();
            we.close();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            throw e;
        } catch(IOException e){
            e.printStackTrace();
            throw e;
        }
        return ret;
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1