2013-09-02 20 views
10

Mam klasy o nazwie PageItem, który ma konstruktora, że ​​trwa Context jako parametru:Gson deserializacji zagnieżdżone obiekty z InstanceCreator

PageItem(Context context) 
{ 
    super(context); 
    this.context = context; 
} 

PageItem ma następujące właściwości:

private int id; 
private String Title; 
private String Description; 
public Newsprovider newsprovider; 
public Topic topic; 

Newsprovider i Topic są inne klasy mojej aplikacji i mają następujących konstruktorów:

Newsprovider (Context context) 
{ 
    super(context); 
    this.context = context; 
} 

Topic (Context context) 
{ 
    super(context); 
    this.context = context; 
} 

PageItem, Newsprovider i Topic są podklasami SQLiteOpenHelper.

Chcę deserializowania PageItem tablicę z Gson, więc napisałem:

GsonBuilder gsonBuilder = new GsonBuilder(); 
gsonBuilder.registerTypeAdapter(PageItem.class, new PageItemInstanceCreator(context)); 
Gson gson = gsonBuilder.create(); 
Pageitem pis[] = gson.fromJson(s, PageItem[].class); 

z PageItemInstanceCreator zdefiniowany jako:

public class PageItemInstanceCreator implements InstanceCreator<PageItem> 
    { 
     private Context context; 

     public PageItemInstanceCreator(Context context) 
     { 
      this.context = context; 
     } 

     @Override 
     public PageItem createInstance(Type type) 
     { 
      PageItem pi = new PageItem(context); 
      return pi; 
     } 
} 

Gdy debugowanie, instancja PageItem ma poprawnie "główną działalność" jako kontekstu podczas , ale jego zmienna składowa newsprovider ma context = null.

Gson utworzył obiekt PageItem używając prawego konstruktora, ale utworzył instancję Newsprovider przy użyciu domyślnego konstruktora bez parametrów. Jak mogę to naprawić?

Odpowiedz

11

Wystarczy dodać nową InstanceCreator klasy pochodnej do NewsProvider tak:

public class NewsProviderInstanceCreator implements InstanceCreator<NewsProvider> 
    { 
     private int context; 

     public NewsProviderInstanceCreator(int context) 
     { 
      this.context = context; 
     } 

     @Override 
     public NewsProvider createInstance(Type type) 
     { 
      NewsProvider np = new NewsProvider(context); 
      return np; 
     } 

} 

i zarejestrować ją w GsonBuilder jak zostało to już zrobione, tak:

GsonBuilder gsonBuilder = new GsonBuilder(); 
gsonBuilder.registerTypeAdapter(PageItem.class, new PageItemInstanceCreator(context)); 
gsonBuilder.registerTypeAdapter(NewsProvider.class, new NewsProviderInstanceCreator(context)); 
Gson gson = gsonBuilder.create(); 
PageItem pis[] = gson.fromJson(s, PageItem[].class); 

powtórzyć to również Topic klasa.

Powiązane problemy