2016-06-05 6 views
0

Meine Klasse ist:Warum Gson Eigenschaft nach der Freigabe ändern?

private static class CameraSize { 
    public CameraSize(int h, int w) { 
     this.h = h; 
     this.w = w; 
    } 

    public int h; 
    public int w; 
} 


List<CameraSize> lstCS=new LinkedList<>(); 
Gson gson = new GsonBuilder().create(); 
for (int l = 0; l < listSize.size(); l++) { 
    int height = listSize.get(l).height; 
    int width = listSize.get(l).width; 
    CameraSize cs = new CameraSize(height, width); 
    lstCS.add(cs); 
} 
gson.toJson(lstCS); 

Ausgabe im Debug:

[{"h":1944,"w":2592},{"h":1458,"w":2592}] 

Ausgabe in Mitteilung:

[{"a":1944,"b":2592},{"a":1458,"b":2592}] 

Warum ??

+0

Verwenden Sie proguard? –

+0

Ja. Ich habe proguard und minifyEnablaed benutzt. –

Antwort

2

Im Freigabemodus, wie Sie in den Kommentaren gesagt haben, haben Sie minifyEnabled.

Die Namen Ihrer Felder werden nach dem Verschleiern geändert. Wenn Sie sie ohne Verschleierung halten wollen, müssen Sie Proguard mitteilen, um sie zu behalten.

können Sie behalten alle verschachtelten CameraSize Klassen:

-keep class **$CameraSize { *; } 

Oder nur die spezifische:

-keep class your.package.to.outer.class.OuterName$CameraSize { *; } 

Sie können es mehr Spezifizierungsfelder optimieren:

-keepclassmembers class your.package.to.outer.class.OuterName$CameraSize { 
    public int h;  
    public int w; 
} 

als Benutzer @Marcin Koziński sagte, yo Sie können auch @Keep Annotation für Ihre Klasse/Felder verwenden, um den Verschleierungsprozess zu vermeiden.

In diesem Fall:

private static class CameraSize { 
    public CameraSize(int h, int w) { 
     this.h = h; 
     this.w = w; 
    } 

    @Keep 
    public int h; 
    @Keep 
    public int w; 
} 
+0

In Android können Sie der 'CameraSize' Klasse auch einfach' @ Keep' hinzufügen. –

+0

@ MarcinKoziński Es ist richtig! Übrigens bevorzuge ich es immer, meine "Keeps" in Progard-Dateien zu haben, um zu vermeiden, etwas zu vergessen. –

+0

Ich denke, es ist eine persönliche Vorliebe. Ich vergesse immer, die ProGuard-Datei hinzuzufügen und es ist einfacher für mich, @ Keep's hinzuzufügen. –