Сериализация представлений Android - вызывает InvalidClassException из IllegalAccessException - PullRequest
2 голосов
/ 20 марта 2012

Я пытаюсь создать приложение для Android, которое будет хранить виджеты (представленные как представления) в базе данных, а затем иметь возможность их воссоздать позже.

Вот суть этого:

public class DBSerializer<T extends View & Serializable> {

public int storeWidget(T widget) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    ObjectOutputStream out = new ObjectOutputStream(bytes);
    out.writeObject(widget);
    byte[] data = bytes.toByteArray();
    bytes.close();
    out.close();
    <store "data" in database>;
    return <unique database id>;
}

public T getWidget(int id) {
    byte[] data = <get data from database for the given id>;
    ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(data));
    return (T)in.readObject();
}

}

К сожалению, in.readObject() создает исключение InvalidClassException с сообщением android.view.View; IllegalAccessException.

Поскольку представление Android напрямую расширяет объект, а объект имеет конструктор без аргументов, разве это не должно работать? Или он пытается вызвать View с помощью конструктора без аргументов? В сообщении об ошибке не совсем ясно, какова точная причина исключения.

Кто-нибудь знает, что вызывает это и как это исправить?

1 Ответ

7 голосов
/ 20 марта 2012

То, что базовый класс имеет конструктор без параметров, не означает, что подклассы будут. TextView не имеет, как и большинство других представлений.

Сериализация View во всей его полноте и последующее извлечение его не кажется хорошей идеей, поскольку View имеет контекст, который может быть разрушен за время между фиксацией сериализованной версии и временем вы получите его.

Возможно, вы можете хранить только те данные, которые вам нужны, в Parcel и использовать их для получения байтового массива, который вы затем сможете хранить в своей базе данных в виде большого двоичного объекта. Скорее всего, этот подход может оказаться полезным в любом случае в сочетании с методом onSaveInstanceState () .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...