从Parcelable类读取和写入java.util.Date

我正在使用Parcelable类。 我如何读写这个类的java.util.Date对象?

使用writeSerializable ,其中Date是可序列化的。 ( 但不是一个好主意,请参阅下面的另一个更好的方法

 @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(); } 

但是序列化操作会消耗很多性能。 如何克服这一点?

所以更好的用法是在写入时将date转换为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()); } 

使用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]; } }; } 

Date类实现了Serializable

所以你可以写

 parcel.writeSerializable(java.util.Date) 

你可以阅读

 java.util.Date date = (java.util.Date)parcel.readSerializable(); 

试试这个方法::

写::

 yourParse.writeSerializable(YourGivenDate) 

阅读::

 Date myDate = yourParse.readSerializable(); 

Kotlin中,我们可以为Parcel创build扩展 – 最简单的解决scheme。

 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()