@@ -58,9 +58,9 @@ public class SimpleSerializable implements Cloneable {
5858 @ J2SIgnore
5959 private static Object classMutex = new Object ();
6060 @ J2SIgnore
61- private static Map <String , String > classMappings = new HashMap <String , String >();
61+ private static Map <String , String > classNameMappings = new HashMap <String , String >();
6262 @ J2SIgnore
63- private static Map <String , String > rClassMappings = new HashMap <String , String >();
63+ private static Map <String , String > classAliasMappings = new HashMap <String , String >();
6464
6565 private int simpleVersion ;
6666
@@ -101,28 +101,28 @@ public static void registerClassShortenName(String clazzName, String shortenName
101101 System .out .println ("Invalid shorten class name for " + clazzName );
102102 return ;
103103 }
104- String sName = classMappings .get (clazzName );
104+ String sName = classNameMappings .get (clazzName );
105105 if (sName != null && !sName .equals (shortenName )) {
106106 System .out .println ("Already existed shorten name " + sName + " for " + clazzName );
107107 }
108- String fName = rClassMappings .get (shortenName );
108+ String fName = classAliasMappings .get (shortenName );
109109 if (fName != null && !fName .equals (clazzName )) {
110110 System .out .println ("Conficted: shorten name " + shortenName + " for " + fName + " and " + clazzName );
111111 }
112112 synchronized (classMutex ) {
113- classMappings .put (clazzName , shortenName );
114- rClassMappings .put (shortenName , clazzName );
113+ classNameMappings .put (clazzName , shortenName );
114+ classAliasMappings .put (shortenName , clazzName );
115115 }
116116 }
117117
118118 @ J2SIgnore
119119 public static String getClassShortenName (String clazzName ) {
120- return classMappings .get (clazzName );
120+ return classNameMappings .get (clazzName );
121121 }
122122
123123 @ J2SIgnore
124124 public static String getClassFullName (String clazzName ) {
125- return rClassMappings .get (clazzName );
125+ return classAliasMappings .get (clazzName );
126126 }
127127
128128 @ J2SIgnore
@@ -447,7 +447,7 @@ private String serialize(SimpleFilter filter, List<SimpleSerializable> ssObjs) {
447447 clazzName = clazz .getName ();
448448 }
449449 if (getSimpleVersion () >= 202 ) {
450- String shortClazzName = classMappings .get (clazzName );
450+ String shortClazzName = classNameMappings .get (clazzName );
451451 if (shortClazzName != null ) {
452452 buffer .append (shortClazzName );
453453 } else {
@@ -461,14 +461,20 @@ private String serialize(SimpleFilter filter, List<SimpleSerializable> ssObjs) {
461461
462462 Map <String , Field > fields = getSerializableFields (clazzName , this .getClass (), false );
463463 boolean ignoring = (filter == null || filter .ignoreDefaultFields ());
464- String [] fMap = fieldMapping ();
464+ Map <String , String > fieldNameMap = getSimpleVersion () >= 202 ? fieldNameMapping () : null ;
465+ String [] fMap = fieldNameMap == null ? fieldMapping () : null ;
465466 try {
466467 for (Iterator <Entry <String , Field >> itr = fields .entrySet ().iterator (); itr .hasNext ();) {
467468 Entry <String , Field > entry = (Entry <String , Field >) itr .next ();
468469 String name = entry .getKey ();
469470 Field field = entry .getValue ();
470471 if (filter != null && !filter .accept (name )) continue ;
471- if (fMap != null && fMap .length > 1 ) {
472+ if (fieldNameMap != null ) {
473+ String alias = fieldNameMap .get (name );
474+ if (alias != null && alias .length () > 0 ) {
475+ name = alias ;
476+ }
477+ } else if (fMap != null && fMap .length > 1 ) {
472478 for (int j = 0 ; j < fMap .length / 2 ; j ++) {
473479 if (name .equals (fMap [j + j ])) {
474480 String newName = fMap [j + j + 1 ];
@@ -2042,14 +2048,20 @@ private boolean deserialize(final String str, int start, List<SimpleSerializable
20422048 Class <?> clazzType = this .getClass ();
20432049 Map <String , Field > fieldMap = getSerializableFields (clazzType .getName (), clazzType , false );
20442050 int objectEnd = index + size ;
2045- String [] fMap = fieldMapping ();
2051+ Map <String , String > fieldAliasMap = getSimpleVersion () >= 202 ? fieldAliasMapping () : null ;
2052+ String [] fMap = fieldAliasMap == null ? fieldMapping () : null ;
20462053 while (index < end && index < objectEnd ) {
20472054 char c1 = str .charAt (index ++);
20482055 int l1 = c1 - baseChar ;
20492056 if (l1 < 0 || index + l1 > end ) return true ; // error
20502057 String fieldName = str .substring (index , index + l1 );
20512058 index += l1 ;
2052- if (fMap != null && fMap .length > 1 ) {
2059+ if (fieldAliasMap != null ) {
2060+ String trueName = fieldAliasMap .get (fieldName );
2061+ if (trueName != null && trueName .length () > 0 ) {
2062+ fieldName = trueName ;
2063+ }
2064+ } else if (fMap != null && fMap .length > 1 ) {
20532065 for (int i = 0 ; i < fMap .length / 2 ; i ++) {
20542066 if (fieldName .equals (fMap [i + i + 1 ])) {
20552067 String trueName = fMap [i + i ];
@@ -2910,6 +2922,26 @@ public void deserialize(Map<String, Object> properties) {
29102922 }
29112923 }
29122924
2925+ /**
2926+ * Fields with alias names.
2927+ * Field name -> Alias
2928+ * @return
2929+ */
2930+ @ J2SIgnore
2931+ protected Map <String , String > fieldNameMapping () {
2932+ return null ;
2933+ }
2934+
2935+ /**
2936+ * Fields with alias names.
2937+ * Alias -> Field name
2938+ * @return
2939+ */
2940+ @ J2SIgnore
2941+ protected Map <String , String > fieldAliasMapping () {
2942+ return null ;
2943+ }
2944+
29132945 /**
29142946 * Fields with alias names.
29152947 * @return
@@ -2918,6 +2950,34 @@ protected String[] fieldMapping() {
29182950 return null ;
29192951 }
29202952
2953+ /**
2954+ * Convert #fieldMapping into #fieldAliasMapping or #fieldNameMapping.
2955+ *
2956+ * @param array, array with string in order of field, alias, field, alias ...
2957+ * @param reversed, true for #fieldAliasMapping, false for fieldNameMapping
2958+ * @return
2959+ */
2960+ @ J2SIgnore
2961+ public static Map <String , String > mappingFromArray (String [] array , boolean reversed ) {
2962+ if (array == null || array .length <= 0 ) {
2963+ return null ;
2964+ }
2965+ Map <String , String > mapping = new HashMap <String , String >(array .length );
2966+ for (int i = 0 ; i < array .length / 2 ; i ++) {
2967+ String name = array [i + i ];
2968+ String alias = array [i + i + 1 ];
2969+ if (name == null || alias == null ) {
2970+ continue ;
2971+ }
2972+ if (reversed ) {
2973+ mapping .put (alias , name );
2974+ } else {
2975+ mapping .put (name , alias );
2976+ }
2977+ }
2978+ return mapping ;
2979+ }
2980+
29212981 /**
29222982 * Fields to be ignored while differences are being calculated.
29232983 * @return
@@ -3073,7 +3133,7 @@ public static SimpleSerializable parseInstance(String str, int start, SimpleFilt
30733133 if (index == -1 ) return null ;
30743134 String clazzName = str .substring (start + 6 , index );
30753135 if (v >= 202 ) {
3076- String longClazzName = rClassMappings .get (clazzName );
3136+ String longClazzName = classAliasMappings .get (clazzName );
30773137 if (longClazzName != null ) {
30783138 clazzName = longClazzName ;
30793139 }
0 commit comments