3838import java .time .LocalDate ;
3939import java .time .LocalDateTime ;
4040import java .util .ArrayList ;
41+ import java .util .Collection ;
4142import java .util .Date ;
4243import java .util .HashMap ;
4344import java .util .HashSet ;
4445import java .util .LinkedHashMap ;
4546import java .util .LinkedHashSet ;
47+ import java .util .List ;
4648import java .util .Map ;
4749import java .util .Set ;
4850import java .util .concurrent .atomic .AtomicBoolean ;
@@ -210,7 +212,8 @@ public void register(Class<?> type, String namespace, String typeName) {
210212 short xtypeId ;
211213 if (serializer != null ) {
212214 if (isStructType (serializer )) {
213- xtypeId = Types .NAMED_STRUCT ;
215+ xtypeId =
216+ (short ) (fory .isCompatible () ? Types .NAMED_COMPATIBLE_STRUCT : Types .NAMED_STRUCT );
214217 } else if (serializer instanceof EnumSerializer ) {
215218 xtypeId = Types .NAMED_ENUM ;
216219 } else {
@@ -220,7 +223,8 @@ public void register(Class<?> type, String namespace, String typeName) {
220223 if (type .isEnum ()) {
221224 xtypeId = Types .NAMED_ENUM ;
222225 } else {
223- xtypeId = Types .NAMED_STRUCT ;
226+ xtypeId =
227+ (short ) (fory .isCompatible () ? Types .NAMED_COMPATIBLE_STRUCT : Types .NAMED_STRUCT );
224228 }
225229 }
226230 register (type , serializer , namespace , typeName , xtypeId );
@@ -530,9 +534,9 @@ private void registerDefaultTypes() {
530534 registerDefaultTypes (Types .INT64_ARRAY , long [].class );
531535 registerDefaultTypes (Types .FLOAT32_ARRAY , float [].class );
532536 registerDefaultTypes (Types .FLOAT64_ARRAY , double [].class );
533- registerDefaultTypes (Types .LIST , ArrayList .class , Object [].class );
534- registerDefaultTypes (Types .SET , HashSet .class , LinkedHashSet .class );
535- registerDefaultTypes (Types .MAP , HashMap .class , LinkedHashMap .class );
537+ registerDefaultTypes (Types .LIST , ArrayList .class , Object [].class , List . class , Collection . class );
538+ registerDefaultTypes (Types .SET , HashSet .class , LinkedHashSet .class , Set . class );
539+ registerDefaultTypes (Types .MAP , HashMap .class , LinkedHashMap .class , Map . class );
536540 registerDefaultTypes (Types .LOCAL_DATE , LocalDate .class );
537541 }
538542
@@ -542,8 +546,12 @@ private void registerDefaultTypes(int xtypeId, Class<?> defaultType, Class<?>...
542546 classInfoMap .put (defaultType , classInfo );
543547 xtypeIdToClassMap .put (xtypeId , classInfo );
544548 for (Class <?> otherType : otherTypes ) {
545- classInfo = newClassInfo (otherType , classResolver .getSerializer (otherType ), (short ) xtypeId );
546- classInfoMap .put (otherType , classInfo );
549+ Serializer <?> serializer =
550+ ReflectionUtils .isAbstract (otherType )
551+ ? classInfo .serializer
552+ : classResolver .getSerializer (otherType );
553+ ClassInfo info = newClassInfo (otherType , serializer , (short ) xtypeId );
554+ classInfoMap .put (otherType , info );
547555 }
548556 }
549557
@@ -561,7 +569,6 @@ public void writeClassInfo(MemoryBuffer buffer, ClassInfo classInfo) {
561569 switch (internalTypeId ) {
562570 case Types .NAMED_ENUM :
563571 case Types .NAMED_STRUCT :
564- case Types .NAMED_COMPATIBLE_STRUCT :
565572 case Types .NAMED_EXT :
566573 if (shareMeta ) {
567574 writeSharedClassMeta (buffer , classInfo );
@@ -572,6 +579,11 @@ public void writeClassInfo(MemoryBuffer buffer, ClassInfo classInfo) {
572579 assert classInfo .typeNameBytes != null ;
573580 metaStringResolver .writeMetaStringBytes (buffer , classInfo .typeNameBytes );
574581 break ;
582+ case Types .NAMED_COMPATIBLE_STRUCT :
583+ case Types .COMPATIBLE_STRUCT :
584+ assert shareMeta : "Meta share must be enabled for compatible mode" ;
585+ writeSharedClassMeta (buffer , classInfo );
586+ break ;
575587 default :
576588 break ;
577589 }
@@ -634,14 +646,17 @@ public ClassInfo readClassInfo(MemoryBuffer buffer) {
634646 switch (internalTypeId ) {
635647 case Types .NAMED_ENUM :
636648 case Types .NAMED_STRUCT :
637- case Types .NAMED_COMPATIBLE_STRUCT :
638649 case Types .NAMED_EXT :
639650 if (shareMeta ) {
640651 return readSharedClassMeta (buffer );
641652 }
642653 MetaStringBytes packageBytes = metaStringResolver .readMetaStringBytes (buffer );
643654 MetaStringBytes simpleClassNameBytes = metaStringResolver .readMetaStringBytes (buffer );
644655 return loadBytesToClassInfo (internalTypeId , packageBytes , simpleClassNameBytes );
656+ case Types .NAMED_COMPATIBLE_STRUCT :
657+ case Types .COMPATIBLE_STRUCT :
658+ assert shareMeta : "Meta share must be enabled for compatible mode" ;
659+ return readSharedClassMeta (buffer );
645660 case Types .LIST :
646661 return getListClassInfo ();
647662 case Types .TIMESTAMP :
0 commit comments