Я работаю с классом Parcelable. Как я могу читать и записывать объект java.util.Date
в этот класс и из этого класса?
Чтение и запись java.util.Date из Parcelable class
Ответ 1
Используйте writeSerializable, где Date является Serializable. (Но не очень хорошая идея. См. ниже еще один лучший способ)
@Override
public void writeToParcel(Parcel out, int flags) {
// Write object
out.writeSerializable(date_object);
}
private void readFromParcel(Parcel in) {
// Read object
date_object = (java.util.Date) in.readSerializable();
}
Но операции сериализации требуют большой производительности. Как можно преодолеть это?
Поэтому лучше использовать конвертацию даты в Long во время записи и прочитать Long и перейти к конструктору Date, чтобы получить Date. См. Ниже код
@Override
public void writeToParcel(Parcel out, int flags) {
// Write long value of Date
out.writeLong(date_object.getTime());
}
private void readFromParcel(Parcel in) {
// Read Long value and convert to date
date_object = new Date(in.readLong());
}
Ответ 2
Используйте date.getTime() для получения длинного формата:
public class MiClass implements Parcelable {
Date date;
public MiClass(Date date) {
this.date = date;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeLong(date != null ? date.getTime() : -1);
}
protected MiClass(Parcel in) {
long tmpDate = in.readLong();
this.date = tmpDate == -1 ? null : new Date(tmpDate);
}
public static final Parcelable.Creator<MiClass> CREATOR = new Parcelable.Creator<MiClass>() {
public MiClass createFromParcel(Parcel source) {
return new MiClass(source);
}
public MiClass[] newArray(int size) {
return new MiClass[size];
}
};
}
Ответ 3
Date
класс реализует Serializable
...
чтобы вы могли написать
parcel.writeSerializable(java.util.Date)
и вы можете читать как
java.util.Date date = (java.util.Date)parcel.readSerializable();
Ответ 4
В Kotlin мы можем создать расширение для Parcel - простейшего решения.
fun Parcel.writeDate(date: Date?) {
writeLong(date?.time ?: -1)
}
fun Parcel.readDate(): Date? {
val long = readLong()
return if (long != -1L) Date(long) else null
}
И используйте его
parcel.writeDate(date)
parcel.readDate()
Ответ 5
Попробуйте это следующим образом:
для записи::
yourParse.writeSerializable(YourGivenDate)
для чтения::
Date myDate = yourParse.readSerializable();