Назад к вопросам
Junior
170
questionbank

Что такое сериализация в контексте разработки на Android?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Сериализация — это процесс преобразования объекта в поток байтов для его сохранения (например, в файл, базу данных) или передачи по сети. Десериализация — обратный процесс восстановления объекта из потока байтов.

В Android это часто используется для:

  • Сохранения состояния Activity/Fragment при изменении конфигурации (с помощью onSaveInstanceState).
  • Передачи данных между Activity/Service/BroadcastReceiver через Intent (с помощью putExtra).
  • Сохранения данных в SharedPreferences или файлах.
  • Сетевой передачи данных.

В Android доступны два основных механизма сериализации:

  1. Serializable:

    • Стандартный интерфейс Java.
    • Прост в реализации (достаточно имплементировать интерфейс).
    • Может быть медленнее и создавать больше временных объектов по сравнению с Parcelable.
    • Некоторые классы (например, TextView) неcериализуемы.
    // Пример Serializable
    import java.io.Serializable;
    
    public class MySerializableObject implements Serializable {
        private String name;
        private int value;
    
        // Конструктор, геттеры, сеттеры...
    }
    
  2. Parcelable:

    • Интерфейс Android, оптимизированный для IPC (Inter-Process Communication).
    • Более производительный и эффективный по сравнению с Serializable в Android.
    • Требует больше ручной работы для реализации (writeToParcel, createFromParcel).
    • Предпочтительный способ для передачи данных между компонентами Android.
    // Пример Parcelable
    import android.os.Parcel;
    import android.os.Parcelable;
    
    public class MyParcelableObject implements Parcelable {
        private String name;
        private int value;
    
        // Конструктор
        public MyParcelableObject(String name, int value) {
            this.name = name;
            this.value = value;
        }
    
        protected MyParcelableObject(Parcel in) {
            name = in.readString();
            value = in.readInt();
        }
    
        public static final Creator<MyParcelableObject> CREATOR = new Creator<MyParcelableObject>() {
            @Override
            public MyParcelableObject createFromParcel(Parcel in) {
                return new MyParcelableObject(in);
            }
    
            @Override
            public MyParcelableObject[] newArray(int size) {
                return new MyParcelableObject[size];
            }
        };
    
        @Override
        public int describeContents() {
            return 0; // В большинстве случаев 0
        }
    
        @Override
        public void writeToParcel(Parcel parcel, int flags) {
            parcel.writeString(name);
            parcel.writeInt(value);
        }
    
        // Геттеры, сеттеры...
    }
    

Сравнение:

Характеристика Serializable Parcelable
Интерфейс java.io.Serializable android.os.Parcelable
Производительность Медленнее Быстрее
Легкость реализации Проще Требует больше кода
Использование Общее Java, сохранение объектов Предпочтительно для Android IPC
Размер Больше накладных расходов Меньше накладных расходов

В Android чаще рекомендуется использовать Parcelable для повышения производительности. Существуют плагины и инструменты, упрощающие генерацию кода для Parcelable.