@@ -514,56 +514,51 @@ def do_object(self, parent=None, ident=0):
514514 # TODO:
515515 raise NotImplementedError ("externalContents isn't implemented yet" )
516516
517+ # Process class data for the entire hierarchy
518+ self ._read_serializable_data (java_object , classdesc , ident )
519+
520+ log_debug (">>> java_object: {0}" .format (java_object ), ident )
521+ return java_object
522+
523+ def _read_serializable_data (self , java_object , classdesc , ident ):
524+ """
525+ Read serializable data following the Java specification more closely.
526+ According to the spec, for each class in the hierarchy (from super to sub):
527+ 1. Read primitive fields
528+ 2. If SC_WRITE_METHOD is set, read custom writeObject data until TC_ENDBLOCKDATA
529+ """
530+ if classdesc .superclass :
531+ self ._read_serializable_data (java_object , classdesc .superclass , ident + 1 )
532+
517533 if classdesc .flags & ClassDescFlags .SC_SERIALIZABLE :
518534 # TODO: look at ObjectInputStream.readSerialData()
519535 # FIXME: Handle the SC_WRITE_METHOD flag
520536
521- # create megalist
522- tempclass = classdesc
523- megalist = []
524- megatypes = []
525537 log_debug ("Constructing class..." , ident )
526- while tempclass :
527- log_debug ( "Class: {0}" . format ( tempclass . name ), ident + 1 )
538+ log_debug ( "Class: {0}" . format ( classdesc . name ), ident + 1 )
539+ if classdesc . fields_names :
528540 class_fields_str = " - " .join (
529541 " " .join ((str (field_type ), field_name ))
530542 for field_type , field_name in zip (
531- tempclass .fields_types , tempclass .fields_names
543+ classdesc .fields_types , classdesc .fields_names
532544 )
533545 )
534- if class_fields_str :
535- log_debug (class_fields_str , ident + 2 )
536-
537- fieldscopy = tempclass .fields_names [:]
538- fieldscopy .extend (megalist )
539- megalist = fieldscopy
546+ log_debug (class_fields_str , ident + 2 )
540547
541- fieldscopy = tempclass . fields_types [:]
542- fieldscopy . extend ( megatypes )
543- megatypes = fieldscopy
548+ log_debug ( "Values count: {0}" . format ( len ( classdesc . fields_names )), ident )
549+ log_debug ( "Prepared list of values: {0}" . format ( classdesc . fields_names ), ident )
550+ log_debug ( "Prepared list of types: {0}" . format ( classdesc . fields_types ), ident )
544551
545- tempclass = tempclass .superclass
546-
547- log_debug ("Values count: {0}" .format (len (megalist )), ident )
548- log_debug ("Prepared list of values: {0}" .format (megalist ), ident )
549- log_debug ("Prepared list of types: {0}" .format (megatypes ), ident )
550-
551- for field_name , field_type in zip (megalist , megatypes ):
552+ for field_name , field_type in zip (classdesc .fields_names , classdesc .fields_types ):
552553 log_debug (
553554 "Reading field: {0} - {1}" .format (field_type , field_name )
554555 )
555556 res = self ._read_value (field_type , ident , name = field_name )
556557 java_object .__setattr__ (field_name , res )
557558
558- if (
559- classdesc .flags & ClassDescFlags .SC_SERIALIZABLE
560- and classdesc .flags & ClassDescFlags .SC_WRITE_METHOD
561- or classdesc .flags & ClassDescFlags .SC_EXTERNALIZABLE
562- and classdesc .flags & ClassDescFlags .SC_BLOCK_DATA
563- or classdesc .superclass is not None
564- and classdesc .superclass .flags & ClassDescFlags .SC_SERIALIZABLE
565- and classdesc .superclass .flags & ClassDescFlags .SC_WRITE_METHOD
566- ):
559+ has_write_method = classdesc .flags & ClassDescFlags .SC_SERIALIZABLE and classdesc .flags & ClassDescFlags .SC_WRITE_METHOD
560+ has_block_data = classdesc .flags & ClassDescFlags .SC_EXTERNALIZABLE and classdesc .flags & ClassDescFlags .SC_BLOCK_DATA
561+ if has_write_method or has_block_data :
567562 # objectAnnotation
568563 log_debug (
569564 "java_object.annotations before: {0}" .format (
@@ -572,6 +567,7 @@ def do_object(self, parent=None, ident=0):
572567 ident ,
573568 )
574569
570+ opcode = None
575571 while opcode != TerminalCode .TC_ENDBLOCKDATA :
576572 opcode , obj = self ._read_and_exec_opcode (ident = ident + 1 )
577573 # , expect=[self.TC_ENDBLOCKDATA, self.TC_BLOCKDATA,
@@ -593,9 +589,6 @@ def do_object(self, parent=None, ident=0):
593589 log_debug ("Java object has extra loading capability." )
594590 java_object .__extra_loading__ (self , ident )
595591
596- log_debug (">>> java_object: {0}" .format (java_object ), ident )
597- return java_object
598-
599592 def do_string (self , parent = None , ident = 0 ):
600593 """
601594 Handles a TC_STRING opcode
0 commit comments