2014-10-11 4 views
0

Я не понял, как создать код, необходимый для правильной реализации Parcelable для объекта, который содержит GregorianCalendar объектов.Как создать Parcelable код для объекта, который содержит GregorianCalendar

E.g. для объекта User, который содержит String name; и GregorianCalendar creationDate;, моя попытка это:

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

@Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(this.name); 
     dest.writeParcelable(this.creationDate, flags); 
    } 

    private User(Parcel in) { 
     this.name = in.readString(); 
     this.creationDate = in.readParcelable(GregorianCalendar.class.getClassLoader()); 
    } 

    public static final Creator<User> CREATOR = new Creator<User>() { 
     public User createFromParcel(Parcel source) { 
      return new User(source); 
     } 

     public User[] newArray(int size) { 
      return new User[size]; 
     } 
    }; 

что, к сожалению, не работает

в writeToParcel() на линии

dest.writeParcelable(this.creationDate, flags); 

получить writeParcelable не может быть применен к GregorianCalendar ошибка

в

this.creationDate = in.readParcelable(GregorianCalendar.class.getClassLoader()); 

получить Несовместимые типы ошибок

Как правильно кодировать Parcelable?

EDIT

Я пробовал некоторые генераторы кода, но использует разные способы, и я не уверен, что это право реализации, первое использование WriteValue и readValue таким образом:

@Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(name); 
     dest.writeValue(creationDate); 
    } 

protected User(Parcel in) { 
     name = in.readString(); 
     creationDate = (GregorianCalendar) in.readValue(GregorianCalendar.class.getClassLoader()); 
    } 

второй использовать

@Override 
     public void writeToParcel(Parcel dest, int flags) { 
      dest.writeString(name); 
      dest.writeSerializable(creationDate); 
     } 

    protected User(Parcel in) { 
      name = in.readString(); 
      creationDate = (GregorianCalendar) in.readSerializable(); 
     } 

Что такое правильный путь?

+0

Вы пытались использовать http://www.parcelabler.com/? – EpicPandaForce

+0

Нет, но я попытался использовать плагин с расширением кода, но создает неправильный код. Сайт, который вы связали использование 'CreationDate = (GregorianCalendar) in.readValue (GregorianCalendar.class.getClassLoader());' и 'dest.writeValue (CreationDate),' Вы могли бы подтвердить, что это правильный путь Parcel GregorianCalendar? – AndreaF

+0

@ Zhuinden см. Редактирование. – AndreaF

ответ

2

Вы можете использовать второй способ, так как GregorianCalendar реализует Serializable, а Parcelable будет работать.

 @Override 
     public void writeToParcel(Parcel dest, int flags) { 
      dest.writeString(name); 
      dest.writeSerializable(creationDate); 
     } 

    protected User(Parcel in) { 
      name = in.readString(); 
      creationDate = (GregorianCalendar) in.readSerializable(); 
    } 

Однако вы НЕ ДОЛЖНЫ сериализации GregorianCalendar, поскольку обновления в GregorianCalendar классе, связанные может вызвать проблемы. Рассмотрим случай, когда вы загружаете файл, содержащий GregorianCalendar объекты, созданные с другой версией API, разница в реализации GregorianCalendar приведет к уверенным ошибкам, достаточно небольшой разницы в serialVersionUID costant, чтобы предотвратить правильную загрузку файла.

Используйте long параметров для хранения миллисекунды даты, если вы не хотите, чтобы переписать всю вашу заявку вы можете легко создать несколько методов для преобразования из Millis в GregorianCalendar и наоборот, как вам нужно.