@@ -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