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) Spеցիֆիկ է 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);
    }

    // Գеттерներ (պատմված չեն կարճության համար)
}