@@ -61,6 +61,7 @@ public class VPack {
6161	private  static  final  String  ATTR_VALUE  = "value" ;
6262
6363	private  final  Map <Type , VPackSerializer <?>> serializers ;
64+ 	private  final  Map <Type , VPackSerializer <?>> enclosingSerializers ;
6465	private  final  Map <Type , VPackDeserializer <?>> deserializers ;
6566	private  final  Map <String , Map <Type , VPackDeserializer <?>>> deserializersByName ;
6667	private  final  Map <Type , VPackInstanceCreator <?>> instanceCreators ;
@@ -74,6 +75,7 @@ public class VPack {
7475
7576	public  static  class  Builder  {
7677		private  final  Map <Type , VPackSerializer <?>> serializers ;
78+ 		private  final  Map <Type , VPackSerializer <?>> enclosingSerializers ;
7779		private  final  Map <Type , VPackDeserializer <?>> deserializers ;
7880		private  final  Map <String , Map <Type , VPackDeserializer <?>>> deserializersByName ;
7981		private  final  Map <Type , VPackInstanceCreator <?>> instanceCreators ;
@@ -86,6 +88,7 @@ public static class Builder {
8688		public  Builder () {
8789			super ();
8890			serializers  = new  HashMap <Type , VPackSerializer <?>>();
91+ 			enclosingSerializers  = new  HashMap <Type , VPackSerializer <?>>();
8992			deserializers  = new  HashMap <Type , VPackDeserializer <?>>();
9093			deserializersByName  = new  HashMap <String , Map <Type , VPackDeserializer <?>>>();
9194			instanceCreators  = new  HashMap <Type , VPackInstanceCreator <?>>();
@@ -171,6 +174,11 @@ public <T> VPack.Builder registerSerializer(final Type type, final VPackSerializ
171174			return  this ;
172175		}
173176
177+ 		public  <T > VPack .Builder  registerEnclosingSerializer (final  Type  type , final  VPackSerializer <T > serializer ) {
178+ 			enclosingSerializers .put (type , serializer );
179+ 			return  this ;
180+ 		}
181+ 
174182		public  <T > VPack .Builder  registerDeserializer (final  Type  type , final  VPackDeserializer <T > deserializer ) {
175183			deserializers .put (type , deserializer );
176184			return  this ;
@@ -229,20 +237,23 @@ public <A extends Annotation> VPack.Builder annotationFieldNaming(
229237		}
230238
231239		public  VPack  build () {
232- 			return  new  VPack (serializers , deserializers , instanceCreators , builderOptions , serializeNullValues ,
233- 					fieldNamingStrategy , deserializersByName , annotationFieldFilter , annotationFieldNaming );
240+ 			return  new  VPack (serializers , enclosingSerializers , deserializers , instanceCreators , builderOptions ,
241+ 					serializeNullValues , fieldNamingStrategy , deserializersByName , annotationFieldFilter ,
242+ 					annotationFieldNaming );
234243		}
235244
236245	}
237246
238- 	private  VPack (final  Map <Type , VPackSerializer <?>> serializers , final  Map <Type , VPackDeserializer <?>> deserializers ,
247+ 	private  VPack (final  Map <Type , VPackSerializer <?>> serializers ,
248+ 		final  Map <Type , VPackSerializer <?>> enclosingSerializers , final  Map <Type , VPackDeserializer <?>> deserializers ,
239249		final  Map <Type , VPackInstanceCreator <?>> instanceCreators , final  BuilderOptions  builderOptions ,
240250		final  boolean  serializeNullValues , final  VPackFieldNamingStrategy  fieldNamingStrategy ,
241251		final  Map <String , Map <Type , VPackDeserializer <?>>> deserializersByName ,
242252		final  Map <Class <? extends  Annotation >, VPackAnnotationFieldFilter <? extends  Annotation >> annotationFieldFilter ,
243253		final  Map <Class <? extends  Annotation >, VPackAnnotationFieldNaming <? extends  Annotation >> annotationFieldNaming ) {
244254		super ();
245255		this .serializers  = serializers ;
256+ 		this .enclosingSerializers  = enclosingSerializers ;
246257		this .deserializers  = deserializers ;
247258		this .instanceCreators  = instanceCreators ;
248259		this .builderOptions  = builderOptions ;
@@ -521,7 +532,7 @@ private void serializeObject(
521532		final  Map <String , Object > additionalFields )
522533			throws  NoSuchMethodException , IllegalAccessException , InvocationTargetException , VPackException  {
523534
524- 		final  VPackSerializer <?> serializer  = serializers . get (entity .getClass ());
535+ 		final  VPackSerializer <?> serializer  = getSerializer (entity .getClass ());
525536		if  (serializer  != null ) {
526537			((VPackSerializer <Object >) serializer ).serialize (builder , name , entity , serializationContext );
527538		} else  {
@@ -583,7 +594,7 @@ private void addValue(
583594				builder .add (name , ValueType .NULL );
584595			}
585596		} else  {
586- 			final  VPackSerializer <?> serializer  = serializers . get (type );
597+ 			final  VPackSerializer <?> serializer  = getSerializer (type );
587598			if  (serializer  != null ) {
588599				((VPackSerializer <Object >) serializer ).serialize (builder , name , value , serializationContext );
589600			} else  if  (type  instanceof  ParameterizedType ) {
@@ -691,4 +702,13 @@ private VPackKeyMapAdapter<Object> getKeyMapAdapter(final Type type) {
691702		return  (VPackKeyMapAdapter <Object >) adapter ;
692703	}
693704
705+ 	private  VPackSerializer <?> getSerializer (final  Type  type ) {
706+ 		VPackSerializer <?> serializer  = serializers .get (type );
707+ 		if  (serializer  == null ) {
708+ 			if  (type  instanceof  Class  && ((Class <?>) type ).isMemberClass ()) {
709+ 				serializer  = enclosingSerializers .get (((Class <?>) type ).getEnclosingClass ());
710+ 			}
711+ 		}
712+ 		return  serializer ;
713+ 	}
694714}
0 commit comments