2011-06-06 115 views
1

ActiveAndroid有一個約束,它的所有實體都需要從某個基類繼承,並且需要一個參數構造函數將上下文(來自活動)作爲輸入。 [不是這個約束的粉絲]。Android:與ActiveAndroid的傑克遜

使用gson,我可以創建一個類型適配器來解決這個約束。

public class PolicyInstanceCreator implements InstanceCreator<Policy>{ 
    private Context context; 

    public PolicyInstanceCreator(Context context) { 
     this.context = context; 
    } 

    @Override 
    public Policy createInstance(Type type) { 
     return new Policy(context); 
    } 
} 

Gson gson = new GsonBuilder().registerTypeAdapter(Policy.class, new PolicyInstanceCreator(context)).create(); 
Policy[] policies = gson.fromJson(myString, Policy[].class); 

一種可能性似乎是我們需要用Jackson來實現一個自定義的desearlizer。

是否有任何替代方案必須爲傑克遜編寫自定義反序列化程序,或者是唯一的選項與特定的一個參數構造函數?

請讓我知道是否有任何其他選擇。

感謝

回答

1

一種選擇是採用混合式註解(見本wiki,或this blog post)添加@JsonCreator指定這個特定的構造函數中使用。 這要求或者'Context'來自JSON(JSON中的名稱可以通過構造器參數的@JsonProperty指定);或者可以傳入null(如果從JSON中找不到這樣的字段,就會發生這種情況)。 如果需要傳遞一個實際的外部上下文對象,自定義的反序列化器就是要走的路(直到實現「外部值注入」;這是計劃但尚未添加的)。

+0

上下文就是活動本身。我對Java並不熟悉,但看着帖子我不確定Active Android想要做什麼。我真的不喜歡ActiveAndroi強加的繼承,這是這個問題的根源。可能不得不關閉ORM。與傑克遜相比,gson的速度更慢,因此可以選擇,否則gson有一個優雅的解決方案來處理實例化。 – 2011-06-07 00:08:36

+0

是的,班級的設計肯定是錯誤的,在一個老式的比較錯誤的方式。 :-) ...至於實例化,也許傑克遜確實需要一種方法來註冊實例化器;如果通常需要添加,應該是微不足道的。 – StaxMan 2011-06-07 05:47:52

+0

那會很好。你參與了這個項目嗎? – 2011-06-07 13:15:25