@@ -561,14 +561,15 @@ private void serializeFields(
561561 final Map <String , FieldInfo > fields = cache .getFields (entity .getClass ());
562562 for (final FieldInfo fieldInfo : fields .values ()) {
563563 if (fieldInfo .isSerialize ()) {
564- serializeField (entity , builder , fieldInfo , additionalFields );
564+ serializeField (entity , builder , fieldInfo , new HashMap < String , Object >() );
565565 }
566566 }
567567 for (final Entry <String , Object > entry : additionalFields .entrySet ()) {
568568 final String key = entry .getKey ();
569569 if (!fields .containsKey (key )) {
570570 final Object value = entry .getValue ();
571- addValue (key , value != null ? value .getClass () : null , value , builder , null , additionalFields );
571+ addValue (key , value != null ? value .getClass () : null , value , builder , null ,
572+ new HashMap <String , Object >());
572573 }
573574 }
574575 }
@@ -607,56 +608,49 @@ private void addValue(
607608 final ParameterizedType pType = ParameterizedType .class .cast (type );
608609 final Type rawType = pType .getRawType ();
609610 if (Iterable .class .isAssignableFrom ((Class <?>) rawType )) {
610- serializeIterable (name , value , builder , additionalFields );
611+ serializeIterable (name , value , builder );
611612 } else if (Map .class .isAssignableFrom ((Class <?>) rawType )) {
612613 serializeMap (name , value , builder , pType .getActualTypeArguments ()[0 ], additionalFields );
613614 } else {
614615 serializeObject (name , value , builder , additionalFields );
615616 }
616617 } else if (Iterable .class .isAssignableFrom ((Class <?>) type )) {
617- serializeIterable (name , value , builder , additionalFields );
618+ serializeIterable (name , value , builder );
618619 } else if (Map .class .isAssignableFrom ((Class <?>) type )) {
619620 serializeMap (name , value , builder , String .class , additionalFields );
620621 } else if (((Class ) type ).isArray ()) {
621- serializeArray (name , value , builder , additionalFields );
622+ serializeArray (name , value , builder );
622623 } else if (((Class ) type ).isEnum ()) {
623624 builder .add (name , Enum .class .cast (value ).name ());
624625 } else if (((Class ) type ) != value .getClass ()) {
625- addValue (name , value .getClass (), value , builder , fieldInfo , additionalFields );
626+ addValue (name , value .getClass (), value , builder , fieldInfo , new HashMap < String , Object >() );
626627 } else {
627628 serializeObject (name , value , builder , additionalFields );
628629 }
629630 }
630631 }
631632
632- private void serializeArray (
633- final String name ,
634- final Object value ,
635- final VPackBuilder builder ,
636- final Map <String , Object > additionalFields )
633+ private void serializeArray (final String name , final Object value , final VPackBuilder builder )
637634 throws NoSuchMethodException , IllegalAccessException , InvocationTargetException , VPackException {
638635 builder .add (name , ValueType .ARRAY );
639636 for (int i = 0 ; i < Array .getLength (value ); i ++) {
640637 final Object element = Array .get (value , i );
641638 if (element != null ) {
642- addValue (null , element .getClass (), element , builder , null , additionalFields );
639+ addValue (null , element .getClass (), element , builder , null , new HashMap < String , Object >() );
643640 } else {
644641 builder .add (ValueType .NULL );
645642 }
646643 }
647644 builder .close ();
648645 }
649646
650- private void serializeIterable (
651- final String name ,
652- final Object value ,
653- final VPackBuilder builder ,
654- final Map <String , Object > additionalFields )
647+ private void serializeIterable (final String name , final Object value , final VPackBuilder builder )
655648 throws NoSuchMethodException , IllegalAccessException , InvocationTargetException , VPackException {
656649 builder .add (name , ValueType .ARRAY );
657650 for (final Iterator iterator = Iterable .class .cast (value ).iterator (); iterator .hasNext ();) {
658651 final Object element = iterator .next ();
659- addValue (null , element != null ? element .getClass () : null , element , builder , null , additionalFields );
652+ addValue (null , element != null ? element .getClass () : null , element , builder , null ,
653+ new HashMap <String , Object >());
660654 }
661655 builder .close ();
662656 }
@@ -678,18 +672,28 @@ private void serializeMap(
678672 final Object entryValue = entry .getValue ();
679673 addValue (keyMapAdapter .serialize (entry .getKey ()),
680674 entryValue != null ? entryValue .getClass () : Object .class , entry .getValue (), builder , null ,
681- additionalFields );
675+ new HashMap < String , Object >() );
682676 }
677+ for (final Entry <String , Object > entry : additionalFields .entrySet ()) {
678+ final String key = entry .getKey ();
679+ if (!map .containsKey (key )) {
680+ final Object additionalValue = entry .getValue ();
681+ addValue (key , additionalValue != null ? additionalValue .getClass () : null , additionalValue ,
682+ builder , null , new HashMap <String , Object >());
683+ }
684+ }
685+ additionalFields .clear ();
683686 builder .close ();
684687 } else {
685688 builder .add (name , ValueType .ARRAY );
686689 final Set <Entry <?, ?>> entrySet = map .entrySet ();
687690 for (final Entry <?, ?> entry : entrySet ) {
688691 final String s = null ;
689692 builder .add (s , ValueType .OBJECT );
690- addValue (ATTR_KEY , entry .getKey ().getClass (), entry .getKey (), builder , null , additionalFields );
693+ addValue (ATTR_KEY , entry .getKey ().getClass (), entry .getKey (), builder , null ,
694+ new HashMap <String , Object >());
691695 addValue (ATTR_VALUE , entry .getValue ().getClass (), entry .getValue (), builder , null ,
692- additionalFields );
696+ new HashMap < String , Object >() );
693697 builder .close ();
694698 }
695699 builder .close ();
0 commit comments