import java.io.Serializable; import java.io.Externalizable; import java.util.List; import java.util.Map; import java.util.HashMap; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.ObjectOutput; import java.io.ObjectInput; public class NonSerializableFieldTest { public static class NS{} public static class S implements Serializable{} public static class E implements Externalizable{ public void readExternal(ObjectInput oi){} public void writeExternal(ObjectOutput oo){} } public static class MySerializable implements Serializable{} public static class SerializableBase implements Serializable{} public static class MyColl extends HashMap{} public static class NotSerializable1 extends SerializableBase{ NS problematic1; List problematic2; Map problematic3; Map problematic4; Map> problematic5; Map problematic6; List problematic7; List problematic8; T problematic9; List problematic10; List problematic11; Map problematic12; Map> problematic13; Map problematic14; transient NS ok1; List ok2; static NS ok3; S ok4; E ok5; MySerializable ok6; MySerializable ok7; MySerializable ok8; MyColl ok9; } public static class NotSerializable2 extends SerializableBase{ NS ok1; // the presence of those two methods is usually enough proof that the implementor // deals with the problems (e.g. by throwing NotSerializableException) private void readObject(ObjectInputStream oos){} private void writeObject(ObjectOutputStream oos){} } // annotations usually signal that the implementor is aware of potential problems @SuppressWarnings("serial") public static class NotSerializable3 extends SerializableBase{ NS ok1; List ok2; } // We don't report Externalizable classes, since they completely take over control during // serialization. Furthermore, Externalizable has priority over Serializable! public static class ExternalizableSerializable implements Serializable, Externalizable { NS ok1; public void readExternal(ObjectInput in){ } public void writeExternal(ObjectOutput out){ } } public static interface Anonymous extends Serializable{} public static void main(String[] args){ Anonymous a1 = new Anonymous(){ NS problematic; }; @SuppressWarnings("serial") Anonymous a2 = new Anonymous(){ NS ok; }; } @SuppressWarnings("serial") public static void someAnnotatedMethod(){ Anonymous a = new Anonymous(){ NS ok; }; } // dummy implementations to avoid javax.ejb imports in tests @interface Stateless {} @interface Stateful {} class SessionBean implements Serializable {} class NonSerializableClass {} @Stateless class StatelessSessionEjb extends SessionBean { NonSerializableClass nonSerializableField; } @Stateful class StatefulSessionEjb extends SessionBean { NonSerializableClass nonSerializableField; } enum Enum { A(null); private NonSerializableClass nonSerializable; Enum(NonSerializableClass nonSerializable) { this.nonSerializable = nonSerializable; } } }