2012-01-09 17 views
3

私はこのようなクラスを持っている:ProGuard難読化、Java、Google Gsonと一般的なコレクション - メンバーの保持方法

public class MyClass 
{ 
    private Queue<MyOtherClass> myQueue; 
} 

私の問題は、私はProGuardのは、GoogleのGsonを使用してJSONにシリアライズした後MYQUEUEを手にすることができないということです。メンバー名 "myQueue"は "a"としてシリアライズされます。明らかに、デシリアライズが解除されます。

私が試したProGuardの設定の一部を以下に示します。

private java.util.Queue<com.my.package.MyOtherClass> myQueue; 

-keepclassmembers class com.my.package.MyClass { 
    #private java.util.Queue<com.my.package.MyOtherClass> myQueue; 
    #private java.util.Queue<com.my.package.*> myQueue; 
    private java.* myQueue; 
} 

... ProGuardのは、クラスが不明であったことを訴えました。私が言ったように、ProGuardの警告を取り除きます....設定が

private java.* myQueue; 

を使用して、未知のクラスjava.util.Queue<com.my.Package.MyOtherClass>'

を意味するが、:

注:メッセージがありますメンバmyQueueはjson出力に保持されません。それは "a"としてシリアライズされます。次のように

関連ProGuardの設定ファイルの残りの部分は次のとおりです。

-renamesourcefileattribute SourceFile 
-keepattributes SourceFile,LineNumberTable 
-keepattributes *Annotation* 
#gson 
-keepattributes Signature 
-adaptresourcefilenames **.properties,**.gif,**.jpg,**.png,**.wav 
-adaptresourcefilecontents **.properties,META-INF/MANIFEST.MF 
-optimizationpasses 3 
-overloadaggressively 
-repackageclasses '' 
-allowaccessmodification 

-keep public class com.my.package.MyOtherClass { 
} 

-keepclassmembers class com.my.package.MyOtherClass { 
    [a large number of private members are listed] 
} 

答えて

1

Javaクラスファイルが消去ジェネリックを含んでいるので、ProGuardのは、あまりにも消去種類を期待しています。したがってjava.util.Queue<com.my.Package.MyOtherClass>java.util.Queueと指定する必要があります。

java.**(サブパッケージ内のクラスにも一致するように倍精度**を指定)を指定すると、ワイルドカードを使用することができます。

Cfr。 ProGuard manual

+0

ありがとうございます。私はマニュアルに苦労しています。私は、私が期待しているシリアライズされたメンバー名を得るために何が必要なのか分かっていません。ほとんどの場合、正確なメンバー名をシリアル化する必要があります。これは私の現在の問題です。しかし、いくつかのケースでは、@SerializedName( "betterName")protected String poorNameを使用しています。 @SerializedNameが動作しているかどうかはまだ分かりませんが... – MountainX

関連する問題