Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to serialize non-serializable base class in standard serialization?

I can't control the source code of the base class, then, how can I use standard serialization on the subclass?

In this example, field a is not serialized at all, though B is serializable:

// a.jar

class A {
    int a;
}

// b.jar

class B
        extends A
        implements Serializable {
    int b;
}

public class HelloWorldApp {

    public static void main(String[] args)
            throws Exception {
        B b = new B();
        b.a = 10;
        b.b = 20;

        ByteArrayOutputStream buf = new ByteArrayOutputStream();

        ObjectOutputStream out = new ObjectOutputStream(buf);
        out.writeObject(b);
        out.close();

        byte[] bytes = buf.toByteArray();
        ByteArrayInputStream _in = new ByteArrayInputStream(bytes);
        ObjectInputStream in = new ObjectInputStream(_in);
        B x = (B) in.readObject();
        System.out.println(x.a);
        System.out.println(x.b);
    }

}

Output:

0
20
like image 949
Xiè Jìléi Avatar asked May 08 '12 06:05

Xiè Jìléi


People also ask

How do you serialize a non-serializable class?

You can't serialise a class that doesn't implement Serializable , but you can wrap it in a class that does. To do this, you should implement readObject and writeObject on your wrapper class so you can serialise its objects in a custom way. First, make your non-serialisable field transient .

How do you serialize an object that does not implement serializable?

If Address is null, you can serialize the whole employee even if Address 's type is not serializable. If you mark Address as transient, it will skip trying to serialize Address . This may solve your problem.

Can we serialize class without implementing serializable interface?

If the superclass is Serializable, then by default, every subclass is serializable. Hence, even though subclass doesn't implement Serializable interface( and if its superclass implements Serializable), then we can serialize subclass object.

What happens if your serializable class contains a member which is not serializable?

It'll throw a NotSerializableException when you try to Serialize it.


1 Answers

You can't!
field a will not be serialized!
Work around: implement your custom serialization. You should implement Externalizable interface and writeExternal, readExternal methods. In thess methods you can write and read value of your a field.

like image 116
alexey28 Avatar answered Oct 16 '22 14:10

alexey28