discomarathon / google-gson

Automatically exported from code.google.com/p/google-gson
0 stars 0 forks source link

Gson should provide a way to configure order for field navigation #131

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
Currently gson 1.3 build output string navigating fields starting from 
class of object that is serializing.

In my case (for human readabilty of serialized strings) I need a reverse 
stratedy - navigate fields of topmost class in hierarchy first and fields 
of serializing object last.

--------------
Here some code: 

changes in com.google.gson.ObjectNavigator:
  public void accept(Visitor visitor) {
    boolean visitedWithCustomHandler = visitor.visitUsingCustomHandler
(obj, objType);
    if (!visitedWithCustomHandler) {
      Object objectToVisit = (obj == null) ? visitor.getTarget() : obj;
      if (objectToVisit == null) {
        return;
      }
      TypeInfo objTypeInfo = new TypeInfo(objType);
      if (exclusionStrategy.shouldSkipClass(objTypeInfo.getRawClass())) {
        return;
      }

      if (ancestors.contains(objectToVisit)) {
        throw new IllegalStateException("Circular reference found: " + 
objectToVisit);
      }
      ancestors.push(objectToVisit);

      try {
        if (objTypeInfo.isArray()) {
          visitor.visitArray(objectToVisit, objType);
        } else {
          visitor.startVisitingObject(objectToVisit);
          // For all classes in the inheritance hierarchy (including the 
current class),
          // visit all fields

 // !!!! changes !!!!
 // collect classes to navigate
          List<Class<?>> classesToNavigate = new ArrayList<Class<?>>();
          for (Class<?> curr = objTypeInfo.getRawClass();
          curr != null && !curr.equals(Object.class); curr = 
curr.getSuperclass()) {
            if (!curr.isSynthetic()) {
                classesToNavigate.add(curr);
            }
          }

 // here we could check somr flag if needed
          Collections.reverse(classesToNavigate);

          for (Class<?> curr : classesToNavigate)
          {
           navigateClassFields(objectToVisit, curr, visitor);
          }
        }
      } finally {
        ancestors.pop();
      }
    }
  }

Original issue reported on code.google.com by kua...@gmail.com on 26 Jun 2009 at 11:55

GoogleCodeExporter commented 9 years ago
deferred for consideration in a future release.

Original comment by inder123 on 29 Sep 2009 at 6:12

GoogleCodeExporter commented 9 years ago

Original comment by inder123 on 1 Nov 2010 at 10:32

GoogleCodeExporter commented 9 years ago

Original comment by inder123 on 3 Nov 2010 at 1:46

GoogleCodeExporter commented 9 years ago

Original comment by limpbizkit on 3 Nov 2010 at 4:57

GoogleCodeExporter commented 9 years ago
Custom type adapters exist to handle this.

Original comment by limpbizkit on 21 Mar 2011 at 9:55