Использование GSON для generi c Parcelable - как получить тип класса - PullRequest
0 голосов
/ 31 января 2020

Предостережение

Возможно, есть более простой / умный способ сделать это. Я не хороший Android разработчик. Пожалуйста, сообщите

Проблема

У меня есть библиотека с около 100 различных моделей. Теперь я должен сделать все эти модели пригодными для продажи.

Вместо реализации writeToParcel для каждого , я подумал, что было бы неплохо, если бы я мог просто создайте суперкласс, который использовал generi c сериализацию logi c. Что-то вроде следующего:

public abstract class Model implements Parcelable
{

    public final static Parcelable.Creator<Model> CREATOR = new Parcelable.Creator<Model>() {
        @Override
        public Model createFromParcel ( Parcel parcel )
        {
            Gson gson = new Gson();
            String type = parcel.readString();
            String serialized = parcel.readString();
            gson.fromJson(serialized, /* HELP ME */)
        }

        @Override
        public Model[] newArray ( int i )
        {
            // TODO: I haven't even read the docs on this method yet
        }
    };

    @Override
    public int describeContents ()
    {
        return 0;
    }

    @Override
    public void writeToParcel ( Parcel parcel, int i )
    {
        Gson gson = new Gson();
        String type = this.getClass().getName();
        String serialized = gson.toJson(this);
        parcel.writeString(type);
        parcel.writeString(serialized);
    }

}

Тогда в каждой из моих моделей я просто говорю:

public class Whatever extends Model {

Проблема в том, что Гсон требует от меня предоставить Type, чтобы сериализации. Как я могу получить это значение Type? Как вы можете видеть, я пытался использовать this.getClass().getName(), чтобы получить имя класса, но я понятия не имею, как изменить это и go из строки обратно в тип. Я также не до конца понимаю разницу между Class<T> и Type.

1 Ответ

0 голосов
/ 04 февраля 2020

Я решил это с помощью:

String type = this.getClass().getCanonicalName();

, чтобы получить тип, а затем:

return (Model) gson.fromJson(serialized, Class.forName(type));

в моем createFromParcel методе

...