Solve Not Serializable Exception
java.io.NotSerializableException
If you try to serialize an object of a class which implements Serializable, but the object includes a reference to an non- Serializable class then a ‘NotSerializableException’ will be thrown at runtime.
The simplest way is to find the class that throws the exception and make it implement the Serializable interface. However, this may not be feasible if the class that throws the exception belongs to a third-party library i.e. org.apache.log4j.Logger.
In case the class refers to non-serializable objects and these objects should not be serialized, then, you can declare these objects as transient. Once a field of a class is declared as transient, then, it is ignored by the serializable runtime.
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
class Employee {
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
/** java.io.NotSerializableException Example. */
public class NotSerializableExceptionExample {
public static void main(String[] args) throws IOException{
//Create FileOutputStream to create file
FileOutputStream out = newFileOutputStream("employee.dat");
//Create ObjectOutputStream
ObjectOutputStream outputStream = new ObjectOutputStream(out);
//Create objects
Employee obj = new Employee();
obj.setId("001");
//Write objects to stream
outputStream.writeObject(obj);
//Always close the stream
outputStream.close();
}
}
Output:
Exception in thread "main" java.io.NotSerializableException: core.geeks.Employee at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330) at core.NotSerializableExceptionExample.main(NotSerializableExceptionExample.java:32)
Fix java.io.NotSerializableException in org.apache.log4j.Logger
org.apache.log4j.Logger is simple, you have to prevent logger instance from default serializabtion process, either make it transient or static.
Making it transient after deserialization logger instance will be null and any logger.debug() call will result in NullPointerException.
By making it static and final you ensure that its thread-safe and all instance of Employee class can share same logger instance.
No comments:
Post a Comment