Sunday, April 29, 2007

Java Tool to check whether an Object instance is Serializable

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;

import com.uign.hitu.entity.PointMallAdvertisement;

/**

* @author Shams

* @created Apr 29, 2007

*/

public class SerializationTest

{

private static final String SUPER = "super";

private static final String SEPARATOR = ":";

private static String sysoutPrefix = "";

private static String sysoutTabSpace = " ";

/**

* A method to test whether a given object is Serializable. It also test the

* Super Class hierarchy.

*

* @param theObjectToTest

* 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;

}

// get the class of the object

final Class objectClass = theObjectToTest.getClass();

// call method along with the Class.

boolean isObjectSerializable = isObjectSerializable( theObjectToTest,

objectClass, pathToObject );

if( !isObjectSerializable )

{

return isObjectSerializable;

}

return true;

}

/**

* This method assumes 'theObjectToTest' is not null.

*

* @param theObjectToTest

* 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 the Object is a Collection, test all the elements it holds

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 );

sysoutPrefix += sysoutTabSpace;

// 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;

}

}

}



// Check all the fields inside the Object with specified class name for

// 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;

}

}

// Now call to check elements in the Super Class. Skip if the Super

// 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() );

return true;

}

/**

* @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();

// Generate The Path to The Field

final String pathToField = pathToContainerObject + SEPARATOR

+ theFieldToTest.getName();

// Skip if the filed is transient or static

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;

}

// Test whether this Field is an instance of Serialzable. If not return

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;

}

if( !theFieldToTest.getType().isPrimitive() )

{

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();

}

String suffix = ( theFieldToTest.getName().charAt( 0 ) + "" )

.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 )

{

final String isMethodName = "is" + suffix;

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." );

}

}

if( gotObject )

{

// 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 + " )" );

if( objectClass.isPrimitive() )

{

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;

}

}

The Main Method & Test Classes:

class SuperClass extends Object

{

private int superMember1 = 1;

protected char superMember2 = 'a';

public Integer superMember3 = new Integer( 2 );

SuperClass()

{

super();

}

}

class ChildClass extends SuperClass implements Serializable

{

private int childMember1 = 1;

protected char childMember2 = 'a';

public Integer childMember3 = new Integer( 2 );

ChildClass()

{

super();

}

}

class GrandChildClass extends ChildClass

{

private double grandChildMember1 = 2.0;

protected Character grandChildMember2 = 'a';

public String grandChildMember3 = "A String";

GrandChildClass()

{

super();

}

}

/**

* @param args

* Command line arguments

*/

public static void main( String args[] )

{

System.out.println( "Starting main..." );

GrandChildClass grandChildClass = new GrandChildClass();

boolean result = isObjectSerializable( grandChildClass, "grandChildClass" );

System.out.println( "Is grandChildClass serializable: " + result );

System.out.println( "\n\n" );

// A Serializable (Array)List of Apparently Non-Serializable Elements

List superClassList = new ArrayList();

superClassList.add( new ChildClass() );

result = isObjectSerializable( superClassList, "superClassList-1" );

System.out.println( "Is superClassList-1 serializable: " + result );

System.out.println( "\n\n" );

// 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 );

System.out.println( "Terminating." );

}


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.

No comments: