2012-02-17 5 views
30

Bu yüzden, daha hızlı olduğu için Android'de Serializable yerine Parcelable kullanılması önerilir.Android Parcelable ve Serializable

Sorum şu: Seri hale getirme hakkından kaçınmak imkansız mıdır?

ben seri hale getirmek istediğiniz özel bir nesne varsa, en Kişi sınıf tipleri parcel.write *() destekleri içerdiğinden ben, şu sınıf tanımını bu parcelable kolaydır yapma

public class Person { 
    String name; 
    int Age; 
    ... 
    .... 
} 

var diyelim

public class PersonTwo { 
    MyCustomObj customObj; 
    String name; 
    int Age; 
    ... 
    .... 
} 

nasıl eşit umuyorum ki: parcel.writeString ve Kişi sınıfı aşağıdaki ne Şimdi eğer parcel.writeInt

, yani orada cel MyCustomObj nesnesini? Seri hale getirilmeyi tekrar kullanmam gerekiyor mu? ama yine de, seri hale getirilebilir kullanmak için SLOW olduğunu düşündüm ve bu durumda kullanmak için başka seçeneğimiz yok gibi görünüyor.

anlamıyorum

Ben bu durumda PersonTwo parsel nasıl

birisi bana söyleyebilir?

+2

Serializable'ı kullanmanızı öneririm. Nexus 5'teki testlere göre Parcelable'dan daha hızlıdır. Https://bitbucket.org/afrishman/androidserializationtest adresine bakın. Unutulmaması gereken ana şey, Serializable'ın sadece varsayılan ayarlarla yavaş olmasıdır. Manuel serileştirme kullanırsanız, çok daha hızlıdır. Ayrıntılar için yukarıdaki bağlantıyı kontrol edin. – nucleo

cevap

2

MyCustomObj parlable yapmalısınız.

16

Ajay tarafından verilen bağlantı tam olarak aradığınız şeydir, bunu nasıl yapabilirsiniz. Eh, ne yapabiliriz sizin CustomObject1 için Parcelable uygulanması ve bunun için bir Parcelable sınıf oluşturmak ve sonra hem CustomObjects parsel edecek başka Parcelable sınıf içinde kendisine Parcel bu Parcelable sınıfını kullanabilirsiniz olduğunu.

public class CustomObject1 implements Parcelable { 

    // parcelable code CustomObject1 
} 

public class CustomObject2 implements Parcelable { 

    private CustomObject1 obj1; 

    // add CustomObject1 here with getter setter 
    // parcelable code for CustomObject2 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeParcelable(obj1, flags); 
    } 
    private void readFromParcel(Parcel in) { 
     obj1 = in.readParcelable(CustomObject1.class.getClassLoader()); 
    } 
    ............ 
} 
+2

Teşekkürler dostum, hem siz hem de ajay'ı cevap olarak kabul ediyorum, ama sadece bir tane seçebiliyorum. neyse teşekkür ederim! – user1118019

+1

Evet, bu nokta ve nasıl yaptığım. Sadece her bir nesneyi gerekli, parcelable çünkü tüm sonunda, kök nesneyi ilkel veya – jonney

-1

Parcelable'ın benim için bir sorun olduğu yere geldim. Android 4.3'te, Parcelable olarak Faaliyetleri arasında veri aktarırken, ayrılmadan istisna alıyorum. Android 4.0, 4.2 veya 4.4 üzerinde çalışıyor. Serializable olarak değiştirilse de, daha yavaş olsa da çalışması gerekir.

+0

dize türleri içerecektir iyi, ben deneyimliyim ve logcat içinde görüyorum ... – MartinC

+2

Ayrıca bir kod ekleyelim böylece kontrol edebilirsiniz sorun android kendisi içinde bırakırsa. – silverado

0

Tüm bileşik nesneler ayrıca Parcelable olmalıdır. Durumda, bir nesneyi atlamak istediğinizde writeToParcel yöntemini kullanmayın.