Android: есть ли ярлык для Serializable из Parcelable без использования marshall ()? - PullRequest
7 голосов
/ 05 мая 2011

Мне известны различия в производительности между Parcelable (быстро) и Serializable (медленно). Однако мне необходимо постоянно хранить определенную информацию о приложении, а не только в течение одного жизненного цикла, поэтому onSaveInstanceState и связанные методы, использующие объекты Parcelable, не подходят.

Итак, я переключил свое внимание на Serializable. Прежде всего, у меня есть AbstractList типы для хранения - это нормально, поскольку они реализуют Serializable. Однако многие из типов, которые я храню внутри, это Parcelable, но не Serializable, например RectF.

Я подумал «без проблем», поскольку я могу легко сгенерировать Посылку с помощью Parcelable.writeToParcel(parcel, flags), а затем вызвать marshall(), чтобы создать byte[], который я могу сериализовать и десериализовать. Я решил использовать дженерики; создайте класс SerializableParcelable<Parcelable> implements Serializable, позволяющий найти подходящее решение для всех типов Parcelable, которые я хочу сериализировать. Тогда я бы, например, сохраните каждый RectF внутри этой оболочки в ArrayList, и список и его содержимое Parcelable будут сериализуемыми.

Однако в документации API указано, что marshall() нельзя использовать для постоянного хранения:

открытый финальный байт [] marshall ()

Возвращает необработанные байты посылки.

Данные, которые вы здесь извлекаете , не должны помещаться в какое-либо постоянное хранилище (на локальный диск, по сети и т. Д.). Для этого вы должны использовать стандартную сериализацию или другой вид общего механизма сериализации. Маршаллическое представление Parcel сильно оптимизировано для локального IPC и поэтому не пытается поддерживать совместимость с данными, созданными в разных версиях платформы.

Так что теперь я застрял. Я могу либо проигнорировать это предупреждение и следовать маршруту, который я обрисовал выше, либо обойти проблему, расширив каждую отдельную Parcelable Я хочу сериализовать и создать специальные методы сериализации, которые кажутся чрезвычайно бесполезными по времени и усилиям.

Кто-нибудь знает «правильный» ярлык для сериализации Parcelable объекта без использования marshall()? Или я должен пахать без учета указанного предупреждения? Возможно, вам подойдет база данных SQLite, но я не уверен и хотел бы получить ваш совет.

Большое спасибо.

1 Ответ

0 голосов
/ 29 марта 2012

Для любого объекта, который необходимо сериализовать, вы можете использовать objectOutPutStream. Используя это, вы можете записывать объекты в файловую систему устройства. Так что это также может использоваться для сохранения Parcelable объектов.

Ниже приведен код для сохранения объекта в файловой системе.

    public static void witeObjectToFile(Context context, Object object, String        filename) {

    ObjectOutputStream objectOut = null;
    FileOutputStream fileOut = null;
    try {
        File file = new File(filename);
        if(!file.exists()){
            file.createNewFile();
        }
        fileOut = new FileOutputStream(file,false);
        objectOut = new ObjectOutputStream(fileOut);
        objectOut.writeObject(object);
        fileOut.getFD().sync();

    } catch (IOException e) {
        e.printStackTrace();
    } catch (NullPointerException e) {
        e.printStackTrace();
    }finally {
        if (objectOut != null) {
            try {
                objectOut.close();
            } catch (IOException e) {
                // do nowt
            }
        }
        if (fileOut != null) {
            try {
                fileOut.close();
            } catch (IOException e) {
                // do nowt
            }
        }
    }
}`

Для чтения объекта используйте ObjectInputStream. Найдите приведенный ниже код.

    public static Object readObjectFromFile(Context context, String filename) {

    ObjectInputStream objectIn = null;
    Object object = null;
    FileInputStream fileIn = null;
    try {
        File file = new File(filename);
        fileIn = new FileInputStream(file);//context.getApplicationContext().openFileInput(filename);
        objectIn = new ObjectInputStream(fileIn);
        object = objectIn.readObject();

    } catch (FileNotFoundException e) {
        // Do nothing
    }catch (NullPointerException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
    }finally {
        if (objectIn != null) {
            try {
                objectIn.close();
            } catch (IOException e) {
                // do nowt
            }
        }
        if(fileIn != null){
            try {
                fileIn.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    return object;
}`

С уважением,
Ша

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