错误:Parceler:无法找到类型为io.realm.RealmList的读/写生成器

时间:2017-07-19 16:09:45

标签: android realm kotlin parceler

我使用Kotlin编写项目:

  • Kotlin版本:1.1.3-2
  • Parcerler版本1.1.9
  • Realm版本3.2.0

我正在使用Parceler将FragmentArgs与RealmObjects一起使用并导致以下崩溃 Parceler:无法找到类型为io.realm.RealmList的读/写生成器

  1. 我的班级工作是这样的:
  2.  
    @Parcel(value = Parcel.Serialization.BEAN, analyze = arrayOf(Job::class))
                open class Job(
                        @PrimaryKey open var tweetId: Long? = -1L,
                        open var text: String = "",
                        open var title: String = "",
                        open var longitude: Double? = null,
                        open var latitude: Double? = null,
                        open var link: String = "",
                    @ParcelPropertyConverter(RealmStringListParcelConverter::class)
                        open var imageUrls: RealmList<RealmString>? = null
                ) : RealmObject()
    
    1. 类RealmString看起来像这样: 我的班级RealmString.kt是这样的:
    2.  
      @Parcel(value = Parcel.Serialization.BEAN, analyze = arrayOf(RealmString::class))
                      open class RealmString(
                              open var value: String = ""
                      ) : RealmObject()
      
      1. RealmListParcelConverter类如下所示:
      2. public class RealmListParcelConverter implements TypeRangeParcelConverter<RealmList<? extends RealmObject>, RealmList<? extends RealmObject>>
        {
            private static final int NULL = -1;
        
            @Override
            public void toParcel(RealmList<? extends RealmObject> input, Parcel parcel)
            {
                parcel.writeInt(input == null ? NULL : input.size());
                if(input != null)
                {
                    for(RealmObject item : input)
                    {
                        parcel.writeParcelable(Parcels.wrap(item), 0);
                    }
                }
            }
        
            @Override
            public RealmList fromParcel(Parcel parcel)
            {
                int       size = parcel.readInt();
                RealmList list = new RealmList();
                for(int i = 0; i < size; i++)
                {
                    Parcelable parcelable = parcel.readParcelable(getClass().getClassLoader());
                    list.add((RealmObject) Parcels.unwrap(parcelable));
                }
                return list;
            }
        }
        

        更新

        我试过添加实现= RealmStringRealmProxy和implements = JobRealmProxy,仍然会遇到同样的问题。

        更新2

        领域版本更新为 3.5.0 ,仍然会遇到同样的问题。

1 个答案:

答案 0 :(得分:1)

最后我得到了一个解决方案。您只需在我的模型setter中添加Job即可。我会在这里给出我的全部代码:

  1. 我的班级工作是这样的:
  2.  
    @Parcel(value = Parcel.Serialization.BEAN, analyze = arrayOf(Job::class))
                open class Job(
                        @PrimaryKey open var tweetId: Long? = -1L,
                        open var text: String = "",
                        open var title: String = "",
                        open var longitude: Double? = null,
                        open var latitude: Double? = null,
                        open var link: String = "",
    
                ) :RealmObject(){
    @ParcelPropertyConverter(RealmStringListParcelConverter::class)
                            open var imageUrls: RealmList<RealmString>? = null set}
    
    1. 类RealmString看起来像这样: 我的班级RealmString.kt是这样的:
    2.  
      @Parcel(value = Parcel.Serialization.BEAN, analyze = arrayOf(RealmString::class))
                      open class RealmString(
                              open var value: String = ""
                      ) : RealmObject()
      
      1. RealmStringListParcelConverter类如下所示:
      2.    class RealmStringListParcelConverter : RealmListParcelConverter<RealmString>() {
            override fun itemToParcel(input: RealmString?, parcel: Parcel?) {
                parcel?.writeParcelable(Parcels.wrap(RealmString::class.java, input), 0)
            }
        
            override fun itemFromParcel(parcel: Parcel?): RealmString {
                return Parcels.unwrap(parcel?.readParcelable<Parcelable>(RealmString::class.java.classLoader))
            }
        }