Мне известны различия в производительности между 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, но я не уверен и хотел бы получить ваш совет.
Большое спасибо.