Sobes.tech
Junior

Сериалдаштырылган жана пакеттерге салынган объекттер деген эмне?

sobes.tech AI

AIден жооп

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

Парселизделүүчү объекттер да пакеттелип, кайра ачылышы мүмкүн, бирок Android'дун атайын механизми android.os.Parcelable колдонулат. Бул механизм Android компоненттери арасында маалымат өткөрүүдө натыйжалуураак, анткени ал IPC (ара-Процесс коммуникациясы) үчүн оптимизацияланган.

Өзгөчөлүк Serializable Parcelable
Механизм Java рефлексиясы Android Parceling API
Иштөө ылдамдыгы Азыркыга караганда азыраак эффективдүү (рефлексияны колдонуу) Эффективдүүраак
Ишке ашыруу Жөнөкөй (маркер интерфейс) 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);
    }

    // Геттерлер (кыскасы үчүн көрсөтүлгөн)
}