@@ -61,6 +61,7 @@ public class VPack {
61
61
private static final String ATTR_VALUE = "value" ;
62
62
63
63
private final Map <Type , VPackSerializer <?>> serializers ;
64
+ private final Map <Type , VPackSerializer <?>> enclosingSerializers ;
64
65
private final Map <Type , VPackDeserializer <?>> deserializers ;
65
66
private final Map <String , Map <Type , VPackDeserializer <?>>> deserializersByName ;
66
67
private final Map <Type , VPackInstanceCreator <?>> instanceCreators ;
@@ -74,6 +75,7 @@ public class VPack {
74
75
75
76
public static class Builder {
76
77
private final Map <Type , VPackSerializer <?>> serializers ;
78
+ private final Map <Type , VPackSerializer <?>> enclosingSerializers ;
77
79
private final Map <Type , VPackDeserializer <?>> deserializers ;
78
80
private final Map <String , Map <Type , VPackDeserializer <?>>> deserializersByName ;
79
81
private final Map <Type , VPackInstanceCreator <?>> instanceCreators ;
@@ -86,6 +88,7 @@ public static class Builder {
86
88
public Builder () {
87
89
super ();
88
90
serializers = new HashMap <Type , VPackSerializer <?>>();
91
+ enclosingSerializers = new HashMap <Type , VPackSerializer <?>>();
89
92
deserializers = new HashMap <Type , VPackDeserializer <?>>();
90
93
deserializersByName = new HashMap <String , Map <Type , VPackDeserializer <?>>>();
91
94
instanceCreators = new HashMap <Type , VPackInstanceCreator <?>>();
@@ -171,6 +174,11 @@ public <T> VPack.Builder registerSerializer(final Type type, final VPackSerializ
171
174
return this ;
172
175
}
173
176
177
+ public <T > VPack .Builder registerEnclosingSerializer (final Type type , final VPackSerializer <T > serializer ) {
178
+ enclosingSerializers .put (type , serializer );
179
+ return this ;
180
+ }
181
+
174
182
public <T > VPack .Builder registerDeserializer (final Type type , final VPackDeserializer <T > deserializer ) {
175
183
deserializers .put (type , deserializer );
176
184
return this ;
@@ -229,20 +237,23 @@ public <A extends Annotation> VPack.Builder annotationFieldNaming(
229
237
}
230
238
231
239
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 );
234
243
}
235
244
236
245
}
237
246
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 ,
239
249
final Map <Type , VPackInstanceCreator <?>> instanceCreators , final BuilderOptions builderOptions ,
240
250
final boolean serializeNullValues , final VPackFieldNamingStrategy fieldNamingStrategy ,
241
251
final Map <String , Map <Type , VPackDeserializer <?>>> deserializersByName ,
242
252
final Map <Class <? extends Annotation >, VPackAnnotationFieldFilter <? extends Annotation >> annotationFieldFilter ,
243
253
final Map <Class <? extends Annotation >, VPackAnnotationFieldNaming <? extends Annotation >> annotationFieldNaming ) {
244
254
super ();
245
255
this .serializers = serializers ;
256
+ this .enclosingSerializers = enclosingSerializers ;
246
257
this .deserializers = deserializers ;
247
258
this .instanceCreators = instanceCreators ;
248
259
this .builderOptions = builderOptions ;
@@ -521,7 +532,7 @@ private void serializeObject(
521
532
final Map <String , Object > additionalFields )
522
533
throws NoSuchMethodException , IllegalAccessException , InvocationTargetException , VPackException {
523
534
524
- final VPackSerializer <?> serializer = serializers . get (entity .getClass ());
535
+ final VPackSerializer <?> serializer = getSerializer (entity .getClass ());
525
536
if (serializer != null ) {
526
537
((VPackSerializer <Object >) serializer ).serialize (builder , name , entity , serializationContext );
527
538
} else {
@@ -583,7 +594,7 @@ private void addValue(
583
594
builder .add (name , ValueType .NULL );
584
595
}
585
596
} else {
586
- final VPackSerializer <?> serializer = serializers . get (type );
597
+ final VPackSerializer <?> serializer = getSerializer (type );
587
598
if (serializer != null ) {
588
599
((VPackSerializer <Object >) serializer ).serialize (builder , name , value , serializationContext );
589
600
} else if (type instanceof ParameterizedType ) {
@@ -691,4 +702,13 @@ private VPackKeyMapAdapter<Object> getKeyMapAdapter(final Type type) {
691
702
return (VPackKeyMapAdapter <Object >) adapter ;
692
703
}
693
704
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
+ }
694
714
}
0 commit comments