2015-11-24 19 views
12

@ParcelPropertyアノテーションを各フィールドに使用せずに、シリアル化のためにKotlinデータクラスとコンストラクタを使用する方法がありますか?Parcelerシリアル化用のコンストラクタを持つKotlinデータクラスを使用するパーセルの使用

私がしようとすると、次のようにライブラリを使用する場合:

@Parcel 
data class Valve @ParcelConstructor constructor(val size: Int) 

私はError:Parceler: No corresponding property found for constructor parameter arg0を取得します。しかし、私が@ParcelProperty("size")を追加してもうまく動作します。
なぜですか?

更新
このライブラリを使用する他の方法があります。
私は(それをテストしていない)私はまた、すべてのコンストラクタのパラメータをオプションにして@JvmOverloadsを追加することができると思うが、それは私が持っている副作用があり、私はちょうど@ParcelConstructor注釈を削除することができ、その後私は、エラー
Error:Parceler: No @ParcelConstructor annotated constructor and no default empty bean constructor found.
を取得しますクラスのすべてのプロパティがnullかどうかをチェックします。

アップデート2
これが私の仕事です:短い生成されたJavaクラスで

@Parcel 
data class Valve(val size: Int? = null) 

は、デフォルトの空のコンストラクタを持っている必要があります。これを実現する1つの方法は、上記のように行うことです。すべての変数にデフォルト値が設定されている必要があります。

答えて

12

ドキュメントによれば、Parcelerはデフォルトでパブリックフィールドで動作します。しかし、通常のKotlin data class(あなたの例のように)は、すべてのKotlinプロパティがプライベートフィールドとgetter/[setter]によって表されるので、むしろ "従来のgetter/setter bean"です。

TL; DR:私はこれがうまくいくと思う:

@Parcel(Serialization.BEAN) 
data class Valve(val size: Int = 10) 

デフォルト値に注意してください、それはKotlinが自動的にJavaの関係者仕様で要求される追加の空のコンストラクタを生成することができます。

もう一つの方法は、我々がすでに持っているコンストラクタをマークするために、次のようになります。

@Parcel(Serialization.BEAN) 
data class Driver @ParcelConstructor constructor(val name: String) 

特定のドキュメント:https://github.com/johncarl81/parceler#gettersetter-serialization

+0

これはデフォルトの空のBeanコンストラクタが必要なので動作しません。私は私の質問を更新します。 –

+0

が空のコンストラクタを持つためには、デフォルト値を 'size'に与えることができます。 – voddan

+0

を更新するか、空のコンストラクタを持つために、@ @ JvmOverloads'が必要ではないので、あなたの例のように '@ ParcelConstructor'をプライマリコンストラクタに追加してください。 – voddan

9

私はこの質問にはすでに答えを持って知っているが、将来の視聴者のために、誰も苦労していますパーセルがkotlinデータオブジェクトを処理するようにするために、私はKotlinデータクラス用のパーセルブルボイラープレートを生成するための新しいアノテーションプロセッサを作成しました。大規模なParcelableあなたのデータクラスを作成するには定型的なコードを減らすために設計されています:

https://github.com/grandstaish/paperparcel

用途:

は、@PaperParcelを使用してデータのクラスに注釈を付けるPaperParcelableを実装し、のJVM静的インスタンスを追加しますCREATORを生成しました。:

@PaperParcel 
data class Example(
    val test: Int, 
    ... 
) : PaperParcelable { 
    companion object { 
    @JvmField val CREATOR = PaperParcelExample.CREATOR 
    } 
} 

今すぐあなたのデータクラスはParcelableあるとBundleまたはIntent

編集に直接渡すことができます。最新のAPIと更新

3

ただ、デフォルトのコンストラクタを追加します。

@Parcel 
data class Valve(val size: Int) { 
    constructor() : this(0) 
} 
+0

なぜdownvote?私は同じ問題を抱えており、これを正確にこの方法で修正しました。 – dmitriyzaitsev

+0

これは私のために働く。あなたはkaptを使う必要があります: 'compile 'org.parceler:parceler-api:1.1.6'' ' kapt' org.parceler:parceler:1.1.6'' –

+0

デフォルト値で 'size'を指定すると上記のように)は、パラメータのないコンストラクタの必要性を満たす必要がありますか? – rdoubleui

関連する問題