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

Что такое сериализуемые и парселируемые объекты?

Sobes Copilot

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

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

sobes.tech AI

Сериализуемые объекты могут быть преобразованы в байтовый поток для хранения или передачи, используя стандартный механизм Java java.io.Serializable.

Парселируемые объекты также могут быть упакованы и распакованы, но используют специализированный механизм Android android.os.Parcelable. Этот механизм более эффективен для передачи данных между компонентами Android, так как оптимизирован для IPC (Inter-Process Communication).

Характеристика Serializable Parcelable
Механизм Java reflection Android Parceling API
Производительность Менее эффективен (использует reflection) Более эффективен
Реализация Проще (маркерный интерфейс) Требует реализации методов writeToParcel, createFromParcel, describeContents
Использование Стандартное Java-приложение, удаленный вызов методов (RMI) Специфично для Android, передача данных между активити, сервисами и т.д.
Бойлерплейт Меньше кода Больше кода

Пример реализации Parcelable:

// MyParcelableObject.java
package com.example.myapplication;

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 dest, int flags) {
        dest.writeString(name);
        dest.writeInt(value);
    }

    // Getters (опущены для краткости)
}