2012-05-24 2 views
4

Есть ли причина, почему вы не можете сериализовать анонимные классы Json?Сериализация анонимных классов с помощью Gson

Пример:

public class AnonymousTest 
{ 
    private Gson gson = new Gson(); 

    public void goWild() 
    { 
     this.callBack(new Result() 
     { 
      public void loginResult(Result loginAttempt) 
      { 
       // Output null 
       System.out.println(this.gson.toJson(result)); 
      } 
     }); 
    } 

    public void callBack(Result result) 
    { 
     // Output null 
     System.out.println(this.gson.toJson(result)); 
     result.loginResult(result); 
    } 

    public static void main(String[] args) 
    { 
     new AnonymousTest().goWild(); 
    } 
} 

Просто начать работу с ним :)

ответ

6

Это объясняется в руководстве пользователя: https://sites.google.com/site/gson/gson-user-guide

Gson может также десериализации статические вложенные классы. Однако Gson не может автоматически десериализовать чистые внутренние классы, так как их конструкторы no-args также нуждаются в ссылке на содержащий объект, который является , недоступным во время десериализации.

Вы можете исправить свой код, сделав Ваш класс неанонимным и статическим:

static class MyResult extends Result { 
    public void loginResult(Result loginAttempt) { 
     System.out.println(new Gson().toJson(result)); 
    } 
} 
... 
this.callBack(new MyResult()); 

Обратите внимание, что вы не можете использовать поле gson от внешнего класса, вы должны сделать новую или получить его из другого места.

+0

А я полностью пропустил этот. Большое спасибо! –

+2

Эта цитата относится к десериализации, а не к сериализации. И конечно, это имеет смысл для десериализации, но не для сериализации. Для сериализатора не имеет значения, что это внутренний класс, для получения его значений не требуется ссылка на внешний класс. –

Смежные вопросы