Чтение и запись java.util.Date из Parcelable class

Я работаю с классом Parcelable. Как я могу читать и записывать объект java.util.Date в этот класс и из этого класса?

Ответ 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();