2012-01-09 78 views
3

我有一類這樣的:ProGuard混淆,java,Google Gson和泛型集合 - 如何保持成員?

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

我的問題是,我不能讓ProGuard的保持myQueue中的序列化後使用谷歌GSON到JSON。會發生什麼是成員名稱「myQueue」被序列化爲「a」。顯然,反序列化隨後打破。

下面是我嘗試過的一些ProGuard配置。

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

隨着

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

... ProGuard的抱怨類是未知的。該消息是:

注:配置指的是未知的類java.util.Queue<com.my.Package.MyOtherClass>'

使用

private java.* myQueue; 

....擺脫了ProGuard的警告,但是,正如我說的,成員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 2012-01-10 03:52:00