Ever got the Exception while developing your Web Application:
java.io.NotSerializableException:java.util.RandomAccessSubList
...
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1054)
at
java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1330)
at
java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1302)
at
java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1245)
at
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1052)
at
java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1224)
at
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1050)
at
java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:278)
I recently ran into a similar exception while developing my application
using Spring, Wicket and Hibernate.
The message in the exception though is insufficient to easily track
which Object is actually not Serializable, because usually the culprit
lies deep in the object graph.
Fed up with this error and the pain of debugging code to find the defaulter
I decided to write up a tool to help me.
First we need to understand when an object ceases to be Serializable.
1) When the object does not directly or indirectly implement
the Serializable interface.
2) When a member of the object is not Serializable.
3) In case of Collections when one of the elements inside the
collection is not Serializable.
So I decided to use the Reflection api in java to write up a class that
will notify whether an object is Serializable or not.
The Java Code:
import java.io.Serializable;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
* @author Shams
* @created
*/
public class SerializationTest
{
* A method to test whether a given object is Serializable. It also test the
* Super Class hierarchy.
*
* The object to test for Serialization
* @param pathToObject
* Custom String to print to recognise the Object
* @return whether the Object is Serializable or not.
*/
public static boolean isObjectSerializable( final Object theObjectToTest,
final String pathToObject )
{
// If the object is null, no need to check
if( theObjectToTest == null )
{
System.out.println( sysoutPrefix + "Skipping " + pathToObject
+ " as it is 'null'" );
return true;
}
final Class objectClass = theObjectToTest.getClass();
boolean isObjectSerializable = isObjectSerializable( theObjectToTest,
objectClass, pathToObject );
if( !isObjectSerializable )
{
return isObjectSerializable;
}
* This method assumes 'theObjectToTest' is not null.
*
* The object to test for Serialization
* @param theObjectClass
* The Class to use while checking whether the Object is
* Serializable
* @param pathToObject
* Custom String to print to recognise the Object
* @return whether the Object is Serializable or not.
*/
private static boolean isObjectSerializable( final Object theObjectToTest,
final Class theObjectClass, final String pathToObject )
{
// Check whether the Class implements Serializable interface
// either directly or indirectly
boolean classSerializable = isClassSerializable( theObjectClass,
pathToObject );
if( !classSerializable )
{
return classSerializable;
}
}
if( theObjectToTest instanceof Collection )
{
Collection theCollectionToTest = (Collection) theObjectToTest;
int i = 0;
for( Object element : theCollectionToTest )
{
sysoutPrefix += sysoutTabSpace;
// Generate The Path to the Element
final String pathToElement = pathToObject + SEPARATOR + "( " + i
+ " )";
// Make an indirect recursive call to test whether this element is
// Serializable
boolean isElementSerializable = isObjectSerializable( element,
pathToElement );
sysoutPrefix = sysoutPrefix.substring( sysoutTabSpace.length() );
if( !isElementSerializable )
{
return isElementSerializable;
}
}
}
// If the Object is an Array, test all the elements it holds
int arrayLength = -1;
try
{
arrayLength = Array.getLength( theObjectToTest );
}
catch( Exception e )
{
// e.printStackTrace();
}
if( arrayLength > -1 )
{
for( int index = 0; index <>
{
Object element = Array.get( theObjectToTest, index );
// Generate The Path to the Element
final String pathToElement = pathToObject + SEPARATOR + "[ "
+ index + " ]";
// Make an indirect recursive call to test whether this element is
// Serializable
boolean isElementSerializable = isObjectSerializable( element,
pathToElement );
sysoutPrefix = sysoutPrefix.substring( sysoutTabSpace.length() );
if( !isElementSerializable )
{
return isElementSerializable;
}
}
}
// Serialization
Field objectFields[] = theObjectClass.getDeclaredFields();
for( Field field : objectFields )
{
sysoutPrefix += sysoutTabSpace;
boolean isFieldSerializable = isFieldSerializable( theObjectToTest,
pathToObject, field );
sysoutPrefix = sysoutPrefix.substring( sysoutTabSpace.length() );
if( !isFieldSerializable )
{
return isFieldSerializable;
}
}
// class is not serializable.
final Class superClass = theObjectClass.getSuperclass();
// Generate a path to the Super Class
String pathToSuperClass = pathToObject + SEPARATOR + SUPER;
sysoutPrefix += sysoutTabSpace;
if( isClassSerializable( superClass, pathToSuperClass ) )
{
// Make recursive call with Super Class as the Class. During this
// method execution the Object will be tested with the Fields of its
// Super Class.
boolean isSuperSerializable = isObjectSerializable( theObjectToTest,
superClass, pathToSuperClass );
if( !isSuperSerializable )
{
sysoutPrefix = sysoutPrefix.substring( sysoutTabSpace.length() );
return isSuperSerializable;
}
}
else
{
System.out.println( sysoutPrefix + "Skipping check on "
+ "Non-Serializable Super Class : " + superClass );
}
sysoutPrefix = sysoutPrefix.substring( sysoutTabSpace.length() );
}
* @param theContainerObject
* The Object containing the field
* @param pathToContainerObject
* Custom String representation to the Field
* @param theFieldToTest
* The Field to test
* @return whether the Field is Serializable
*/
private static boolean isFieldSerializable( final Object theContainerObject,
final String pathToContainerObject, final Field theFieldToTest )
{
final Class objectClass = theContainerObject.getClass();
final String pathToField = pathToContainerObject + SEPARATOR
+ theFieldToTest.getName();
final boolean isTransient = Modifier.isTransient( theFieldToTest
.getModifiers() );
if( isTransient )
{
System.out.println( sysoutPrefix + "Skipping " + pathToField
+ " as it is declared 'transient'" );
return true;
}
final boolean isStatic = Modifier
.isStatic( theFieldToTest.getModifiers() );
if( isStatic )
{
System.out.println( sysoutPrefix + "Skipping " + pathToField
+ " as it is declared 'static'" );
return true;
}
boolean isFieldClassSerializable = isClassSerializable( theFieldToTest
.getType(), pathToField );
if( !isFieldClassSerializable )
{
System.out.println( sysoutPrefix + "Field Class( '"
+ theFieldToTest.getName() + "'-" + theFieldToTest.getType()
+ " ) of " + objectClass + " is NOT Serializable" );
return isFieldClassSerializable;
}
{
boolean isFieldObjectSerializable;
final boolean isPublic = Modifier.isPublic( theFieldToTest
.getModifiers() );
Object fieldObject = null;
boolean gotObject = false;
if( isPublic )
{
try
{
// If the object is public get it
fieldObject = theFieldToTest.get( theContainerObject );
gotObject = true;
}
catch( IllegalArgumentException e )
{
// e.printStackTrace();
}
catch( IllegalAccessException e )
{
// e.printStackTrace();
}
}
else
{
// For protected and private members make them accessible via
// reflection
theFieldToTest.setAccessible( true );
try
{
// If the object is public get it
fieldObject = theFieldToTest.get( theContainerObject );
gotObject = true;
}
catch( IllegalArgumentException e )
{
// e.printStackTrace();
}
catch( IllegalAccessException e )
{
// e.printStackTrace();
}
.toUpperCase();
if( theFieldToTest.getName().length() > 1 )
{
suffix += theFieldToTest.getName().substring( 1 );
}
if( !gotObject )
{
final String getterMethodName = "get" + suffix;
try
{
Method getMethod = objectClass.getMethod( getterMethodName,
null );
fieldObject = getMethod.invoke( theContainerObject, null );
gotObject = true;
}
catch( SecurityException e )
{
// e.printStackTrace();
}
catch( NoSuchMethodException e )
{
// e.printStackTrace();
}
catch( IllegalArgumentException e )
{
// e.printStackTrace();
}
catch( IllegalAccessException e )
{
// e.printStackTrace();
}
catch( InvocationTargetException e )
{
// e.printStackTrace();
}
}
if( !gotObject )
{
try
{
Method getMethod = objectClass.getMethod( isMethodName, null );
fieldObject = getMethod.invoke( theContainerObject, null );
gotObject = true;
}
catch( SecurityException e )
{
// e.printStackTrace();
}
catch( NoSuchMethodException e )
{
// e.printStackTrace();
}
catch( IllegalArgumentException e )
{
// e.printStackTrace();
}
catch( IllegalAccessException e )
{
// e.printStackTrace();
}
catch( InvocationTargetException e )
{
// e.printStackTrace();
}
}
if( !gotObject )
{
System.out.println( sysoutPrefix + "Skipping " + pathToField
+ " as Found no [visible] get/is method." );
}
}
{
// Test whether the Object representaing the Field is Serializable
isFieldObjectSerializable = isObjectSerializable( fieldObject,
pathToField );
if( !isFieldObjectSerializable )
{
System.out.println( sysoutPrefix + "Field Object( '"
+ theFieldToTest.getName() + "'-"
+ theFieldToTest.getType() + " ) of " + objectClass
+ " is NOT Serializable" );
return isFieldObjectSerializable;
}
}
}
return true;
}
* @param objectClass
* The Class to test whether it is Serializable
* @param pathToObject
* The path to the Object whose Class is being tested
*/
private static boolean isClassSerializable( final Class objectClass,
final String pathToObject )
{
System.out.println( sysoutPrefix + "Testing isClassSerializable( "
+ objectClass + " , " + pathToObject + " )" );
{
return true;
}
if( Collection.class.isAssignableFrom( objectClass ) )
{
System.out.println( sysoutPrefix + "isClassSerializable()::"
+ "Skipping Serializable check on '" + objectClass
+ "' as it is a Collection class" );
return true;
}
if( !Serializable.class.isAssignableFrom( objectClass ) )
{
System.out.println( sysoutPrefix + "'" + pathToObject
+ "' is NOT Serializable." );
return false;
}
return true;
}
{
private int superMember1 = 1;
{
super();
}
}
{
private int childMember1 = 1;
{
super();
}
}
{
private double grandChildMember1 = 2.0;
{
super();
}
}
* @param args
* Command line arguments
*/
public static void main( String args[] )
{
System.out.println( "Starting main..." );
boolean result = isObjectSerializable( grandChildClass, "grandChildClass" );
System.out.println( "Is grandChildClass serializable: " + result );
// A Serializable (Array)List of Apparently Non-Serializable Elements
List
superClassList.add( new ChildClass() );
result = isObjectSerializable( superClassList, "superClassList-1" );
System.out.println( "Is superClassList-1 serializable: " + result );
// A Serializable (Array)List of Non-Serializable Elements
superClassList = new ArrayList
superClassList.add( new SuperClass() );
result = isObjectSerializable( superClassList, "superClassList-2" );
System.out.println( "Is superClassList-2 serializable: " + result );
}
The console Output
Starting main...
Testing isClassSerializable( class tests.GrandChildClass , grandChildClass )
Testing isClassSerializable( double , grandChildClass:grandChildMember1 )
Testing isClassSerializable( class java.lang.Character , grandChildClass:grandChildMember2 )
Testing isClassSerializable( class java.lang.Character , grandChildClass:grandChildMember2 )
Skipping grandChildClass:grandChildMember2:MIN_RADIX as it is declared 'static'
Skipping grandChildClass:grandChildMember2:MAX_RADIX as it is declared 'static'
Skipping grandChildClass:grandChildMember2:MIN_VALUE as it is declared 'static'
Skipping grandChildClass:grandChildMember2:MAX_VALUE as it is declared 'static'
Skipping grandChildClass:grandChildMember2:TYPE as it is declared 'static'
Skipping grandChildClass:grandChildMember2:UNASSIGNED as it is declared 'static'
Skipping grandChildClass:grandChildMember2:UPPERCASE_LETTER as it is declared 'static'
Skipping grandChildClass:grandChildMember2:LOWERCASE_LETTER as it is declared 'static'
Skipping grandChildClass:grandChildMember2:TITLECASE_LETTER as it is declared 'static'
Skipping grandChildClass:grandChildMember2:MODIFIER_LETTER as it is declared 'static'
Skipping grandChildClass:grandChildMember2:OTHER_LETTER as it is declared 'static'
Skipping grandChildClass:grandChildMember2:NON_SPACING_MARK as it is declared 'static'
Skipping grandChildClass:grandChildMember2:ENCLOSING_MARK as it is declared 'static'
Skipping grandChildClass:grandChildMember2:COMBINING_SPACING_MARK as it is declared 'static'
Skipping grandChildClass:grandChildMember2:DECIMAL_DIGIT_NUMBER as it is declared 'static'
Skipping grandChildClass:grandChildMember2:LETTER_NUMBER as it is declared 'static'
Skipping grandChildClass:grandChildMember2:OTHER_NUMBER as it is declared 'static'
Skipping grandChildClass:grandChildMember2:SPACE_SEPARATOR as it is declared 'static'
Skipping grandChildClass:grandChildMember2:LINE_SEPARATOR as it is declared 'static'
Skipping grandChildClass:grandChildMember2:PARAGRAPH_SEPARATOR as it is declared 'static'
Skipping grandChildClass:grandChildMember2:CONTROL as it is declared 'static'
Skipping grandChildClass:grandChildMember2:FORMAT as it is declared 'static'
Skipping grandChildClass:grandChildMember2:PRIVATE_USE as it is declared 'static'
Skipping grandChildClass:grandChildMember2:SURROGATE as it is declared 'static'
Skipping grandChildClass:grandChildMember2:DASH_PUNCTUATION as it is declared 'static'
Skipping grandChildClass:grandChildMember2:START_PUNCTUATION as it is declared 'static'
Skipping grandChildClass:grandChildMember2:END_PUNCTUATION as it is declared 'static'
Skipping grandChildClass:grandChildMember2:CONNECTOR_PUNCTUATION as it is declared 'static'
Skipping grandChildClass:grandChildMember2:OTHER_PUNCTUATION as it is declared 'static'
Skipping grandChildClass:grandChildMember2:MATH_SYMBOL as it is declared 'static'
Skipping grandChildClass:grandChildMember2:CURRENCY_SYMBOL as it is declared 'static'
Skipping grandChildClass:grandChildMember2:MODIFIER_SYMBOL as it is declared 'static'
Skipping grandChildClass:grandChildMember2:OTHER_SYMBOL as it is declared 'static'
Skipping grandChildClass:grandChildMember2:INITIAL_QUOTE_PUNCTUATION as it is declared 'static'
Skipping grandChildClass:grandChildMember2:FINAL_QUOTE_PUNCTUATION as it is declared 'static'
Skipping grandChildClass:grandChildMember2:ERROR as it is declared 'static'
Skipping grandChildClass:grandChildMember2:DIRECTIONALITY_UNDEFINED as it is declared 'static'
Skipping grandChildClass:grandChildMember2:DIRECTIONALITY_LEFT_TO_RIGHT as it is declared 'static'
Skipping grandChildClass:grandChildMember2:DIRECTIONALITY_RIGHT_TO_LEFT as it is declared 'static'
Skipping grandChildClass:grandChildMember2:DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC as it is declared 'static'
Skipping grandChildClass:grandChildMember2:DIRECTIONALITY_EUROPEAN_NUMBER as it is declared 'static'
Skipping grandChildClass:grandChildMember2:DIRECTIONALITY_EUROPEAN_NUMBER_SEPARATOR as it is declared 'static'
Skipping grandChildClass:grandChildMember2:DIRECTIONALITY_EUROPEAN_NUMBER_TERMINATOR as it is declared 'static'
Skipping grandChildClass:grandChildMember2:DIRECTIONALITY_ARABIC_NUMBER as it is declared 'static'
Skipping grandChildClass:grandChildMember2:DIRECTIONALITY_COMMON_NUMBER_SEPARATOR as it is declared 'static'
Skipping grandChildClass:grandChildMember2:DIRECTIONALITY_NONSPACING_MARK as it is declared 'static'
Skipping grandChildClass:grandChildMember2:DIRECTIONALITY_BOUNDARY_NEUTRAL as it is declared 'static'
Skipping grandChildClass:grandChildMember2:DIRECTIONALITY_PARAGRAPH_SEPARATOR as it is declared 'static'
Skipping grandChildClass:grandChildMember2:DIRECTIONALITY_SEGMENT_SEPARATOR as it is declared 'static'
Skipping grandChildClass:grandChildMember2:DIRECTIONALITY_WHITESPACE as it is declared 'static'
Skipping grandChildClass:grandChildMember2:DIRECTIONALITY_OTHER_NEUTRALS as it is declared 'static'
Skipping grandChildClass:grandChildMember2:DIRECTIONALITY_LEFT_TO_RIGHT_EMBEDDING as it is declared 'static'
Skipping grandChildClass:grandChildMember2:DIRECTIONALITY_LEFT_TO_RIGHT_OVERRIDE as it is declared 'static'
Skipping grandChildClass:grandChildMember2:DIRECTIONALITY_RIGHT_TO_LEFT_EMBEDDING as it is declared 'static'
Skipping grandChildClass:grandChildMember2:DIRECTIONALITY_RIGHT_TO_LEFT_OVERRIDE as it is declared 'static'
Skipping grandChildClass:grandChildMember2:DIRECTIONALITY_POP_DIRECTIONAL_FORMAT as it is declared 'static'
Skipping grandChildClass:grandChildMember2:MIN_HIGH_SURROGATE as it is declared 'static'
Skipping grandChildClass:grandChildMember2:MAX_HIGH_SURROGATE as it is declared 'static'
Skipping grandChildClass:grandChildMember2:MIN_LOW_SURROGATE as it is declared 'static'
Skipping grandChildClass:grandChildMember2:MAX_LOW_SURROGATE as it is declared 'static'
Skipping grandChildClass:grandChildMember2:MIN_SURROGATE as it is declared 'static'
Skipping grandChildClass:grandChildMember2:MAX_SURROGATE as it is declared 'static'
Skipping grandChildClass:grandChildMember2:MIN_SUPPLEMENTARY_CODE_POINT as it is declared 'static'
Skipping grandChildClass:grandChildMember2:MIN_CODE_POINT as it is declared 'static'
Skipping grandChildClass:grandChildMember2:MAX_CODE_POINT as it is declared 'static'
Testing isClassSerializable( char , grandChildClass:grandChildMember2:value )
Skipping grandChildClass:grandChildMember2:serialVersionUID as it is declared 'static'
Skipping grandChildClass:grandChildMember2:FAST_PATH_MAX as it is declared 'static'
Skipping grandChildClass:grandChildMember2:SIZE as it is declared 'static'
Skipping grandChildClass:grandChildMember2:$assertionsDisabled as it is declared 'static'
Testing isClassSerializable( class java.lang.Object , grandChildClass:grandChildMember2:super )
'grandChildClass:grandChildMember2:super' is NOT Serializable.
Skipping check on Non-Serializable Super Class : class java.lang.Object
Testing isClassSerializable( class java.lang.String , grandChildClass:grandChildMember3 )
Testing isClassSerializable( class java.lang.String , grandChildClass:grandChildMember3 )
Testing isClassSerializable( class [C , grandChildClass:grandChildMember3:value )
Testing isClassSerializable( class [C , grandChildClass:grandChildMember3:value )
Testing isClassSerializable( class java.lang.Object , grandChildClass:grandChildMember3:value:super )
'grandChildClass:grandChildMember3:value:super' is NOT Serializable.
Skipping check on Non-Serializable Super Class : class java.lang.Object
Testing isClassSerializable( int , grandChildClass:grandChildMember3:offset )
Testing isClassSerializable( int , grandChildClass:grandChildMember3:count )
Testing isClassSerializable( int , grandChildClass:grandChildMember3:hash )
Skipping grandChildClass:grandChildMember3:serialVersionUID as it is declared 'static'
Skipping grandChildClass:grandChildMember3:serialPersistentFields as it is declared 'static'
Skipping grandChildClass:grandChildMember3:CASE_INSENSITIVE_ORDER as it is declared 'static'
Testing isClassSerializable( class java.lang.Object , grandChildClass:grandChildMember3:super )
'grandChildClass:grandChildMember3:super' is NOT Serializable.
Skipping check on Non-Serializable Super Class : class java.lang.Object
Testing isClassSerializable( class tests.ChildClass , grandChildClass:super )
Testing isClassSerializable( class tests.ChildClass , grandChildClass:super )
Testing isClassSerializable( int , grandChildClass:super:childMember1 )
Testing isClassSerializable( char , grandChildClass:super:childMember2 )
Testing isClassSerializable( class java.lang.Integer , grandChildClass:super:childMember3 )
Testing isClassSerializable( class java.lang.Integer , grandChildClass:super:childMember3 )
Skipping grandChildClass:super:childMember3:MIN_VALUE as it is declared 'static'
Skipping grandChildClass:super:childMember3:MAX_VALUE as it is declared 'static'
Skipping grandChildClass:super:childMember3:TYPE as it is declared 'static'
Skipping grandChildClass:super:childMember3:digits as it is declared 'static'
Skipping grandChildClass:super:childMember3:DigitTens as it is declared 'static'
Skipping grandChildClass:super:childMember3:DigitOnes as it is declared 'static'
Skipping grandChildClass:super:childMember3:sizeTable as it is declared 'static'
Testing isClassSerializable( int , grandChildClass:super:childMember3:value )
Skipping grandChildClass:super:childMember3:SIZE as it is declared 'static'
Skipping grandChildClass:super:childMember3:serialVersionUID as it is declared 'static'
Testing isClassSerializable( class java.lang.Number , grandChildClass:super:childMember3:super )
Testing isClassSerializable( class java.lang.Number , grandChildClass:super:childMember3:super )
Skipping grandChildClass:super:childMember3:super:serialVersionUID as it is declared 'static'
Testing isClassSerializable( class java.lang.Object , grandChildClass:super:childMember3:super:super )
'grandChildClass:super:childMember3:super:super' is NOT Serializable.
Skipping check on Non-Serializable Super Class : class java.lang.Object
Testing isClassSerializable( class tests.SuperClass , grandChildClass:super:super )
'grandChildClass:super:super' is NOT Serializable.
Skipping check on Non-Serializable Super Class : class tests.SuperClass
Is grandChildClass serializable: true
Testing isClassSerializable( class java.util.ArrayList , superClassList-1 )
isClassSerializable()::Skipping Serializable check on 'class java.util.ArrayList' as it is a Collection class
Testing isClassSerializable( class tests.ChildClass , superClassList-1:( 0 ) )
Testing isClassSerializable( int , superClassList-1:( 0 ):childMember1 )
Testing isClassSerializable( char , superClassList-1:( 0 ):childMember2 )
Testing isClassSerializable( class java.lang.Integer , superClassList-1:( 0 ):childMember3 )
Testing isClassSerializable( class java.lang.Integer , superClassList-1:( 0 ):childMember3 )
Skipping superClassList-1:( 0 ):childMember3:MIN_VALUE as it is declared 'static'
Skipping superClassList-1:( 0 ):childMember3:MAX_VALUE as it is declared 'static'
Skipping superClassList-1:( 0 ):childMember3:TYPE as it is declared 'static'
Skipping superClassList-1:( 0 ):childMember3:digits as it is declared 'static'
Skipping superClassList-1:( 0 ):childMember3:DigitTens as it is declared 'static'
Skipping superClassList-1:( 0 ):childMember3:DigitOnes as it is declared 'static'
Skipping superClassList-1:( 0 ):childMember3:sizeTable as it is declared 'static'
Testing isClassSerializable( int , superClassList-1:( 0 ):childMember3:value )
Skipping superClassList-1:( 0 ):childMember3:SIZE as it is declared 'static'
Skipping superClassList-1:( 0 ):childMember3:serialVersionUID as it is declared 'static'
Testing isClassSerializable( class java.lang.Number , superClassList-1:( 0 ):childMember3:super )
Testing isClassSerializable( class java.lang.Number , superClassList-1:( 0 ):childMember3:super )
Skipping superClassList-1:( 0 ):childMember3:super:serialVersionUID as it is declared 'static'
Testing isClassSerializable( class java.lang.Object , superClassList-1:( 0 ):childMember3:super:super )
'superClassList-1:( 0 ):childMember3:super:super' is NOT Serializable.
Skipping check on Non-Serializable Super Class : class java.lang.Object
Testing isClassSerializable( class tests.SuperClass , superClassList-1:( 0 ):super )
'superClassList-1:( 0 ):super' is NOT Serializable.
Skipping check on Non-Serializable Super Class : class tests.SuperClass
Skipping superClassList-1:serialVersionUID as it is declared 'static'
Skipping superClassList-1:elementData as it is declared 'transient'
Testing isClassSerializable( int , superClassList-1:size )
Testing isClassSerializable( class java.util.AbstractList , superClassList-1:super )
isClassSerializable()::Skipping Serializable check on 'class java.util.AbstractList' as it is a Collection class
Testing isClassSerializable( class java.util.AbstractList , superClassList-1:super )
isClassSerializable()::Skipping Serializable check on 'class java.util.AbstractList' as it is a Collection class
Testing isClassSerializable( class tests.ChildClass , superClassList-1:super:( 0 ) )
Testing isClassSerializable( int , superClassList-1:super:( 0 ):childMember1 )
Testing isClassSerializable( char , superClassList-1:super:( 0 ):childMember2 )
Testing isClassSerializable( class java.lang.Integer , superClassList-1:super:( 0 ):childMember3 )
Testing isClassSerializable( class java.lang.Integer , superClassList-1:super:( 0 ):childMember3 )
Skipping superClassList-1:super:( 0 ):childMember3:MIN_VALUE as it is declared 'static'
Skipping superClassList-1:super:( 0 ):childMember3:MAX_VALUE as it is declared 'static'
Skipping superClassList-1:super:( 0 ):childMember3:TYPE as it is declared 'static'
Skipping superClassList-1:super:( 0 ):childMember3:digits as it is declared 'static'
Skipping superClassList-1:super:( 0 ):childMember3:DigitTens as it is declared 'static'
Skipping superClassList-1:super:( 0 ):childMember3:DigitOnes as it is declared 'static'
Skipping superClassList-1:super:( 0 ):childMember3:sizeTable as it is declared 'static'
Testing isClassSerializable( int , superClassList-1:super:( 0 ):childMember3:value )
Skipping superClassList-1:super:( 0 ):childMember3:SIZE as it is declared 'static'
Skipping superClassList-1:super:( 0 ):childMember3:serialVersionUID as it is declared 'static'
Testing isClassSerializable( class java.lang.Number , superClassList-1:super:( 0 ):childMember3:super )
Testing isClassSerializable( class java.lang.Number , superClassList-1:super:( 0 ):childMember3:super )
Skipping superClassList-1:super:( 0 ):childMember3:super:serialVersionUID as it is declared 'static'
Testing isClassSerializable( class java.lang.Object , superClassList-1:super:( 0 ):childMember3:super:super )
'superClassList-1:super:( 0 ):childMember3:super:super' is NOT Serializable.
Skipping check on Non-Serializable Super Class : class java.lang.Object
Testing isClassSerializable( class tests.SuperClass , superClassList-1:super:( 0 ):super )
'superClassList-1:super:( 0 ):super' is NOT Serializable.
Skipping check on Non-Serializable Super Class : class tests.SuperClass
Skipping superClassList-1:super:modCount as it is declared 'transient'
Testing isClassSerializable( class java.util.AbstractCollection , superClassList-1:super:super )
isClassSerializable()::Skipping Serializable check on 'class java.util.AbstractCollection' as it is a Collection class
Testing isClassSerializable( class java.util.AbstractCollection , superClassList-1:super:super )
isClassSerializable()::Skipping Serializable check on 'class java.util.AbstractCollection' as it is a Collection class
Testing isClassSerializable( class tests.ChildClass , superClassList-1:super:super:( 0 ) )
Testing isClassSerializable( int , superClassList-1:super:super:( 0 ):childMember1 )
Testing isClassSerializable( char , superClassList-1:super:super:( 0 ):childMember2 )
Testing isClassSerializable( class java.lang.Integer , superClassList-1:super:super:( 0 ):childMember3 )
Testing isClassSerializable( class java.lang.Integer , superClassList-1:super:super:( 0 ):childMember3 )
Skipping superClassList-1:super:super:( 0 ):childMember3:MIN_VALUE as it is declared 'static'
Skipping superClassList-1:super:super:( 0 ):childMember3:MAX_VALUE as it is declared 'static'
Skipping superClassList-1:super:super:( 0 ):childMember3:TYPE as it is declared 'static'
Skipping superClassList-1:super:super:( 0 ):childMember3:digits as it is declared 'static'
Skipping superClassList-1:super:super:( 0 ):childMember3:DigitTens as it is declared 'static'
Skipping superClassList-1:super:super:( 0 ):childMember3:DigitOnes as it is declared 'static'
Skipping superClassList-1:super:super:( 0 ):childMember3:sizeTable as it is declared 'static'
Testing isClassSerializable( int , superClassList-1:super:super:( 0 ):childMember3:value )
Skipping superClassList-1:super:super:( 0 ):childMember3:SIZE as it is declared 'static'
Skipping superClassList-1:super:super:( 0 ):childMember3:serialVersionUID as it is declared 'static'
Testing isClassSerializable( class java.lang.Number , superClassList-1:super:super:( 0 ):childMember3:super )
Testing isClassSerializable( class java.lang.Number , superClassList-1:super:super:( 0 ):childMember3:super )
Skipping superClassList-1:super:super:( 0 ):childMember3:super:serialVersionUID as it is declared 'static'
Testing isClassSerializable( class java.lang.Object , superClassList-1:super:super:( 0 ):childMember3:super:super )
'superClassList-1:super:super:( 0 ):childMember3:super:super' is NOT Serializable.
Skipping check on Non-Serializable Super Class : class java.lang.Object
Testing isClassSerializable( class tests.SuperClass , superClassList-1:super:super:( 0 ):super )
'superClassList-1:super:super:( 0 ):super' is NOT Serializable.
Skipping check on Non-Serializable Super Class : class tests.SuperClass
Testing isClassSerializable( class java.lang.Object , superClassList-1:super:super:super )
'superClassList-1:super:super:super' is NOT Serializable.
Skipping check on Non-Serializable Super Class : class java.lang.Object
Is superClassList-1 serializable: true
Testing isClassSerializable( class java.util.ArrayList , superClassList-2 )
isClassSerializable()::Skipping Serializable check on 'class java.util.ArrayList' as it is a Collection class
Testing isClassSerializable( class tests.SuperClass , superClassList-2:( 0 ) )
'superClassList-2:( 0 )' is NOT Serializable.
Is superClassList-2 serializable: false
Terminating.