Gson десериализует вложенные объекты с помощью InstanceCreator

У меня есть класс с именем PageItem, у которого есть конструктор, который принимает параметр Context as:

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

PageItem имеет следующие свойства:

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

Newsprovider и Topic являются другими классами моего приложения и имеют следующие конструкторы:

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

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

PageItem, Newsprovider и Topic являются подклассами SQLiteOpenHelper.

Я хочу десериализовать массив PageItem с помощью Gson, поэтому я написал:

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

с PageItemInstanceCreator, определяемым как:

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; 
        }
}

При отладке экземпляр PageItem имеет правильную "MainActivity" в качестве контекста while но его переменная-член Newsprovider имеет context = null.

Gson создал объект PageItem, используя правый конструктор, но создал экземпляр Newsprovider, используя конструктор без параметров без параметров. Как я могу это исправить?

Ответ 1

Просто добавьте новый InstanceCreator производный класс для NewsProvider следующим образом:

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; 
        }

}

и зарегистрируйте его в GsonBuilder, как вы уже сделали, например:

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);

повторите его также для класса Topic.