2012-02-17 5 views
30

Так что я знаю, что рекомендуется использовать Parcelable вместо Serializable в android, потому что это быстрее.Android Parcelable и Serializable

Мой вопрос: невозможно ли избежать использования права Serializable?

Если у меня есть пользовательский объект я хочу сериализации, скажем, у меня есть следующее определение класса

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

Создание этого parcelable легко, потому что класс Person содержит типы parcel.write *() поддерживает , т.е. есть parcel.writeString и parcel.writeInt

Теперь, что если класс Person является следующее:

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

Как я полагаю, пар cel объект MyCustomObj? Кажется, мне нужно снова использовать serializable? но опять же, я думал, что SLOW использует сериализуемое, и, похоже, у нас нет выбора, кроме как использовать его в этом случае.

Я не понимаю

может кто-нибудь сказать мне, как я бы разбазаривать PersonTwo в этом случае?

+2

Я предлагаю вам использовать Serializable. Согласно испытаниям на Nexus 5, это намного быстрее, чем Parcelable. См. Https://bitbucket.org/afrishman/androidserializationtest. Главное, чтобы помнить, что Serializable медленнее только с настройками по умолчанию. Если вы используете ручную сериализацию, это намного быстрее. Подробнее см. Ссылку выше. – nucleo

ответ

2

Вам нужно сделать MyCustomObj обоснованным.

16

Ссылка, предоставленная Ajay, является тем, что вы ищете, как вы можете это сделать. Ну, что вы можете сделать, это реализовать Parcelable к вашему CustomObject1 и создать Parcelable класс для него, а затем вы можете использовать этот Parcelable класс Parcel его внутри другого Parcelable класса, который будет Parcel как CustomObjects.

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

Спасибо, чувак, я бы принял и вас, и аджай как ответ, но, похоже, я могу выбрать только один. В любом случае, благодарю Вас!! – user1118019

+1

Да, это место и как я это делаю. Просто сделайте каждый отдельный объект необходимым, точным, потому что в конце всего этого корневой объект будет содержать примитивные или строковые типы – jonney

-1

Я пришел, чтобы указать, где Parcelable является проблемой для меня. На Android 4.3, я получаю исключение unmarhalling, когда передаю данные между Деятельность как возможно. Он работает нормально на Android 4.0, 4.2 или 4.4. Он должен работать, если его изменить на Serializable, хотя он медленнее.

+0

ну, вот что я испытываю и вижу в logcat ... – MartinC

+2

Пожалуйста, добавьте код, чтобы также можно было проверить если проблема лежит внутри самого андроида. – silverado

0

Все составные объекты также должны быть взаимозаменяемыми. В случае, если вы хотите пропустить объект, тогда не используйте метод writeToParcel.

Смежные вопросы