【问题标题】:Reading and writing java.util.Date from Parcelable class从 Parcelable 类中读取和写入 java.util.Date
【发布时间】:2014-01-27 20:06:08
【问题描述】:

我正在使用 Parcelable 类。如何在此类中读取和写入 java.util.Date 对象?

【问题讨论】:

    标签: java android


    【解决方案1】:

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

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

    【讨论】:

    • 但是序列化操作会消耗很多性能。如何克服这一点?
    • 你真的应该使用 long 来实现,因为 Serializable 不利于性能,这在旧设备上很明显。您可能还想看看 Joda,因为它包含许多有用的工具,并且有一个我经常觉得更有用的 DateTime 对象。
    • 现在可以了。我更喜欢使用 long 而不是序列化。
    • @Mesut 太好了! congs 你有你的解决方案。
    • @JockyDoe 它不会。打包和取消打包时字段的顺序很重要。因此,请检查您是否对两个字段使用相同的顺序。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      使用 date.getTime() 获取 Long 格式:

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

      【讨论】:

      • 这是一个很好的解决方案,但不适用于 1970 年 1 月 1 日之前的日期。 -1L 实际上是表示 1/1/1970 之前一毫秒的有效值。因此,为了更好的安全性,我宁愿使用 Long.MIN_VALUE 之类的值。
      【解决方案4】:

      试试这个(Kotlin):

      data class DateParcel(val date: Date?):Parcelable {
      constructor(parcel: Parcel) : this(parcel.readValue(Date::class.java.classLoader) as? Date
      )
      
      override fun writeToParcel(parcel: Parcel, flags: Int) {
          parcel.writeValue(date)
      }
      
      override fun describeContents(): Int {
          return 0
      }
      
      companion object CREATOR : Parcelable.Creator<DateParcel> {
          override fun createFromParcel(parcel: Parcel): DateParcel {
              return DateParcel(parcel)
          }
      
          override fun newArray(size: Int): Array<DateParcel?> {
              return arrayOfNulls(size)
          }
      }}
      

      【讨论】:

        【解决方案5】:

        Date 类实现Serializable...

        所以你可以写

        parcel.writeSerializable(java.util.Date)
        

        你可以像这样阅读

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

        【讨论】:

        • 虽然这可行,但我建议 SO 的用户使用 longs 查看答案。
        【解决方案6】:

        试试这个方法::

        写::

        yourParse.writeSerializable(YourGivenDate)
        

        阅读::

        Date myDate = yourParse.readSerializable();
        

        【讨论】:

          猜你喜欢
          • 2021-08-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-10
          • 2018-04-03
          • 2019-03-03
          • 2015-07-07
          • 1970-01-01
          相关资源
          最近更新 更多