java小知識,大智慧

java知識面不少,若是想系統的學習java知識,最好是看完一本相關書籍,其實這本書籍不用是什麼名人寫的,只要他有幾年的開發經驗基本上能夠寫出一個入門級的java圖書。因此我在這就不去講一些總體框架的東西了,就說一下日常遇到的小問題吧。java


小問題,大智慧哦。且看:框架

public class BatchQuery {
    private Results results;
    public class Results {
        private String id;
        private Result result;
        public Results(){

        }
        public void setId(String id){
            this.id = id;
        }
        public String getId(){
            return this.id;
        }
        public void setResult(Result result){
            this.result = result;
        }
        public Result getResult(){
            return this.result;
        }
    }
}


若是我按照通常狀況下使用jackson對字符型數據反序列化的話會不會有問題,建議你們思考2分鐘,好好看看代碼哦ide

運行以後發現會報:函數


no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?)學習


從字面意義上你們能夠看出來,是告訴咱們缺乏構造函數致使的,可是我明確的在內部類中把默認的構造函數重新寫了一遍,可是還出現這個問題ui


其實這個是一個老生常談的問題了,表面看起來是關乎java的序列化和反序列化,首先官方對序列化和反序列化的解釋爲:this

序列化:把對象轉換爲字節序列的過程稱爲對象的序列化。spa

反序列化:把字節序列恢復爲對象的過程稱爲對象的反序列化。orm


可是答案爲:把普通內部類配置爲靜態內部類,加static就能夠正常運行了,由答案反推基本上能夠肯定跟序列化和反序列化的原理沒有關係了對象


那問題基本上就要圍繞java的靜態內部類來深究了:

我查了網上的資料有一位同窗的講解很到位非靜態內部類(包括匿名內部類)被編譯器經過隱藏的構造器傳遞了一組隱藏變量.直接結果就是, 無默認構造函數 -- 即便代碼裏面確實有一個無參的構造函數可使用。

public class BatchQuery$Results
{
  private String id;
  private BatchQuery.Result result;
  public BatchQuery$Results(BatchQuery this$0) {}
  public void setId(String id)
  {
    this.id = id;
  }
  public String getId()
  {
    return this.id;
  } 
  public void setResult(BatchQuery.Result result)
  {
    this.result = result;
  }
  public BatchQuery.Result getResult()
  {
    return this.result;
  }
}

以上是編譯後的內容,你們能夠發現並無零參數構造函數。這個就不能賴jackson返回缺乏默認的構造函數了

相關文章
相關標籤/搜索