Soru Android: Parcelable ve Serializable arasındaki fark nedir?


Android neden nesneleri serileştirmek için 2 arayüz sağlıyor? Android ile seri hale getirilebilir nesneler etkileşimde bulunur mu? Binder ve AIDL dosyaları?


221
2017-07-23 23:26


Menşei


@Vivek Kumar Samele bağlantısı öldü - ZhiXingZhe - WangYuQi
Evet, sunucuda bazı sorunlar var, rahatsızlık için özür dilerim, yakında kullanıma sunulacak. - Vivek Kumar Samele


Cevaplar:


Android'de, nesneleri aktivitelere geçiremeyeceğimizi biliyoruz. Nesneler, bunu yapmak için Seri hale getirilebilir veya Parceble arabirimini kullanmalıdır.

serilestirilebilir

Seri hale getirilebilir standart bir Java arabirimidir. Sadece Serializable arayüzünü uygulayabilir ve geçersiz kılma yöntemlerini ekleyebilirsiniz. Bu yaklaşımdaki problem, yansımanın kullanılması ve yavaş bir süreç olmasıdır. Bu yöntem birçok geçici nesne yaratır ve oldukça fazla çöp toplamasına neden olur. Seri hale getirilebilir arayüzün uygulanması daha kolaydır.

Aşağıdaki örneğe bakın (Seri hale getirilebilir)

//MyObjects Serializable class

import java.io.Serializable;
import java.util.ArrayList;
import java.util.TreeMap;

import android.os.Parcel;
import android.os.Parcelable;

public class MyObjects implements Serializable {

    private String name;
    private int age;

    public ArrayList<String> address;

    public MyObjects(String name, int age, ArrayList<String> address) {
        super();
        this.name = name;
        this.age = age;
        this.address = address;
    }

    public ArrayList<String> getAddress() {
        if (!(address == null))
            return address;
        else
            return new ArrayList<String>();
    }

    public String getName() {
        return name;
    }

    public String getAge() {
        return age;
    }
}



//MyObjects instance
MyObjects mObjects = new MyObjects("name","age","Address array here");

//Passing MyObjects instance via intent
Intent mIntent = new Intent(FromActivity.this, ToActivity.class);
mIntent.putExtra("UniqueKey", mObjects);
startActivity(mIntent);


//Getting MyObjects instance
Intent mIntent = getIntent();
MyObjects workorder = (MyObjects)    mIntent.getSerializableExtra("UniqueKey");

Parcelable

Parcelanabilir işlem, serileştirilebilirden daha hızlıdır. Bunun nedenlerinden biri, çıkarım yapmak için yansıtma kullanmak yerine serileştirme süreci konusunda açık olduğumuzdur. Ayrıca, bu amaç için kodun en iyi şekilde optimize edilmiş olmasının nedeni de budur.

Aşağıdaki örneğe bakın (Parcelable)

//MyObjects Parcelable class

import java.util.ArrayList;

import android.os.Parcel;
import android.os.Parcelable;

public class MyObjects implements Parcelable {

    private int age;
    private String name;

    private ArrayList<String> address;

    public MyObjects(String name, int age, ArrayList<String> address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    public MyObjects(Parcel source) {
        age = source.readInt();
        name = source.readString();
        address = source.createStringArrayList();
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(age);
        dest.writeString(name);
        dest.writeStringList(address);
    }

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

    public ArrayList<String> getAddress() {
        if (!(address == null))
            return address;
        else
            return new ArrayList<String>();
    }

    public static final Creator<MyObjects> CREATOR = new Creator<MyObjects>() {
        @Override
        public MyObjects[] newArray(int size) {
            return new MyObjects[size];
        }

        @Override
        public MyObjects createFromParcel(Parcel source) {
            return new MyObjects(source);
        }
    };

}





MyObjects mObjects = new MyObjects("name","age","Address array here");

//Passing MyOjects instance
Intent mIntent = new Intent(FromActivity.this, ToActivity.class);
mIntent.putExtra("UniqueKey", mObjects);
startActivity(mIntent);


//Getting MyObjects instance
Intent mIntent = getIntent();
MyObjects workorder = (MyObjects) mIntent.getParcelableExtra("UniqueKey");




//You can pass Arraylist of Parceble obect as below

//Array of MyObjects
ArrayList<MyObjects> mUsers;

//Passing MyOjects instance
Intent mIntent = new Intent(FromActivity.this, ToActivity.class);
mIntent.putParcelableArrayListExtra("UniqueKey", mUsers);
startActivity(mIntent);


//Getting MyObjects instance
Intent mIntent = getIntent();
ArrayList<MyObjects> mUsers = mIntent.getParcelableArrayList("UniqueKey");

Sonuç.

  1. Parcelable, seri hale getirilebilir arabirimden daha hızlıdır
  2. Parcelable arabirimi, seri hale getirilebilir arabirime göre uygulama için daha fazla zaman alır
  3. Seri hale getirilebilir arayüz uygulanması daha kolay
  4. Seri hale getirilebilir arayüz çok sayıda geçici nesne yaratır ve biraz çöp toplamaya neden olur
  5. Parcelable dizi android Niyet yoluyla geçirilebilir

335
2018-05-14 06:46



@Sujith ne demek istiyorsun yansıma kullanılır? Nedir yansıma? - AnV
@AbhinavVutukuri Yansıma, Object.getClass () ve benzeri yöntemlerle çalışma zamanında nesnelerin, alanların ve yöntemlerin incelenmesi için kullanılan terimdir. - FaultException
anladım... stackoverflow.com/questions/6201311/... - Himanshu Mori
Seri hale getirilebilir veriler, kalıcı veriler için daha iyidir, diğer taraftan ayrıştırılabilir nesneler kalıcı olmamalıdır. Bu gerçekten kötü bir uygulama - TheAnimatrix
@Sujith Birden fazla insanın belirttiği gibi, Parcelable nesneleri (güvenilir bir şekilde) kalıcı hale getirilemez, fakat Seri hale getirilebilir olanlar (sınırlar içinde) olabilir. Cevabınız en yüksek puanlama olduğundan ve tüm önemli farklılıkları kapsama konusunda izlenim verdiğinden, muhtemelen bu noktadan bahsetmelisiniz. - LarsH


serilestirilebilir standart bir Java arabirimidir. Arayüzü uygulayarak bir Serializable sınıfını işaretlersiniz ve Java belirli durumlarda otomatik olarak serileştirir.

Parcelable diziselleştirmeyi kendiniz uyguladığınız Android'e özgü bir arabirimdir. Serializable'ın çok daha verimli olması ve varsayılan Java serileştirme şemasıyla ilgili bazı sorunların üstesinden gelmek için yaratıldı.

Binder ve AIDL'nin Parcelable nesnelerle çalıştığına inanıyorum.

Ancak, Serializable nesnelerini Intents'ta kullanabilirsiniz.


162
2017-07-24 02:21



Parcelable nesnesini nasıl serileştiririm? Nasıl kalıcı hale getiririm? - Hades
@Haded Nesne durumunun içeriğini alın ve bir dosya veya SQLLite veritabanında saklayın. Seriliasing, android veya farklı uygulamalardaki farklı bileşenler arasında aktarılabilir nesneler yapmak için kullanışlıdır. - jonney
Bu harika bir açıklama. Bunu da fark ettim: "Parsel genel amaçlı bir serileştirme mekanizması değildir. Bu sınıf (ve isteğe bağlı nesneleri bir Parsel'e yerleştirmek için karşılık gelen Parcelable API), yüksek performanslı bir IPC nakliyesi olarak tasarlanmıştır. Herhangi bir Parsel verilerini kalıcı depolamaya yerleştirin: Parsel'teki verilerin herhangi birinin altında yatan uygulamadaki değişiklikler eski verilerin okunamaz hale gelmesine neden olabilir. " developer.android.com/reference/android/os/Parcel.html - Sam003
@Zhisheng keyfi nesneler ne anlama geliyor? Parsel'e ne tür objeler koyabiliriz? - hasnain_ahmad
Nesneleri json yerine json dizgisine dönüştürmeye ne dersiniz? - F.O.O


İyi bir vatandaş olmak istiyorsanız, uygulamak için ekstra zaman ayırın   Parcelable, 10 kat daha hızlı ve daha az kullanacağından   kaynaklar.

Bununla birlikte, çoğu durumda, Seri hale getirilebilirliğin yavaşlığı olmaz.   farkedilebilir. Kullanmaktan çekinmeyin, ancak serileştirmenin olduğunu unutmayın.   Pahalı bir işlem olduğundan, minimumda tutun.

Binlerce seri hale getirilmiş nesne içeren bir listeyi geçmeye çalışıyorsanız,   Tüm sürecin bir saniyeden fazla sürmesi mümkündür. O   portre yapmaktan geçişe geçiş yapabilir veya dönüş yapabilir   halsiz.

Bu noktaya kaynak: http://www.developerphil.com/parcelable-vs-serializable/


34
2018-03-12 11:44





Parcelable'da, geliştiriciler marşlama ve unmarshaling için özel kod yazarak Seri hale getirme ile karşılaştırıldığında daha az çöp nesnesi oluşturur. Parselable for Serialization'ın performansı, bu özel uygulama nedeniyle önemli ölçüde artıyor (yaklaşık iki kat daha hızlı).

Serileştirme, kullanıcının gereksinimlerine göre verileri marshal edemeyeceği anlamına gelen bir işaretleyici arabirimdir. Serileştirme'de, Java yansıtma API'sini kullanarak bir Java Sanal Makinesi (JVM) üzerinde bir marşlama işlemi gerçekleştirilir. Bu, Java nesnesinin üyesini ve davranışını tanımlamaya yardımcı olur, ancak çok fazla çöp nesnesi oluşturmayı da sağlar. Bu nedenle, Seri hale getirme işlemi Parcelable'a göre yavaştır.

Düzenle: Sıralama ve unmarshalling'in anlamı nedir?

Birkaç kelimeyle "sıralama", veri veya nesneleri bir bayt akışına dönüştürme işlemine gönderme yapar ve "unmarshalling", orijinal veri veya nesnelere bayt akış işaretini dönüştürme işleminin tersidir. Dönüşüm, "serileştirme" ile elde edilir.

http://www.jguru.com/faq/view.jsp?EID=560072


21
2018-02-01 06:26



Verbose örneği olmadan bile oldukça iyi bir açıklama. Sadece revizyon için ihtiyacım olan şey. - sud007


Aslında, seri hale getirilebilirliği savunan tek kişi olacağım. Hız farkı, cihazlar birkaç yıl öncesinden çok daha iyi olduğu ve daha da ince farklılıklar olduğu için artık bu kadar sert değil. Görmek bloğum Daha fazla bilgi için konuya mesaj gönderin.


12
2018-03-25 02:12



Paylaşım için teşekkür ederim. Bu nadir ve hiper optimizasyon durumlarda kararlaştırılabilir ve ticaret kapalı ihtiyaçlarının uygulanması için daha az karmaşık. - Ankan-Zerob
Alternatif bakış açısı, özellikle deney ve sonuçlarla desteklendiğinde çok yardımcı olur. Varolan Parcelable tabanlı bir kaynak koduyla çalışmam gerekiyor ve şimdi blog yayınınızı okuduğumdan bazılarını yeniden düzenleyebilirim. - Les


1. Seri hale getirilebilir

@görmek http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html

Neyin arayüzü?

  • standart bir Java arayüzüdür

hız

  • Parcelable'dan daha yavaş

2. Parcelable

@görmek http://developer.android.com/reference/android/os/Parcelable.html

Neyin arayüzü?

  • android.os arayüzü
    • Google'da daha iyi performans için Google'ın Geliştirilmiş Parcelable anlamına geldiğini

hız

  • daha hızlı (android geliştirmede kullanım için optimize edildiğinden)

> Sonuçta

Serializable'ın standart bir Java arayüzü olduğunu ve Parcelable'ın Android Geliştirme için olduğunu unutmayın.


12
2017-08-18 08:37



Bunların kullanımını da eklemelisiniz. - Anshul Tyagi


Marshaling ve unshashaling ile ilgili bazı performans sorunu var. Parcelable, Serializable'dan iki kat daha hızlıdır.

Lütfen aşağıdaki bağlantıdan geçin:

http://www.3pillarglobal.com/insights/parcelable-vs-java-serialization-in-android-app-development


7
2017-12-31 08:01



Evet haklısın geeksforandroidgeeks.com/android/... - Vivek Kumar Samele