专栏名称: java一日一条
主要是讲解编程语言java,并且每天都推送一条关于java编程语言的信息
目录
相关文章推荐
Java编程精选  ·  为什么不建议用 equals 判断对象相等? ·  昨天  
芋道源码  ·  SpringBoot3.4.0 结构化日志详解 ·  17 小时前  
芋道源码  ·  MySQL 中 Varchar(50) 和 ... ·  3 天前  
芋道源码  ·  如何快速同步第三方平台数据? ·  4 天前  
芋道源码  ·  几个必会的JDK性能监控和故障处理工具 ·  4 天前  
51好读  ›  专栏  ›  java一日一条

java小知识,大智慧

java一日一条  · 公众号  · Java  · 2018-12-05 21:38

正文

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分钟,好好看看代码哦

运行之后发现会报:


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


从字面意义上大家可以看出来,是告诉我们缺少构造函数导致的,但是我明确的在内部类中把默认的构造函数从新写了一遍,但是还出现这个问题


其实这个是一个老生常谈的问题了,表面看起来是关乎java的序列化和反序列化,首先官方 对序列化和反序列化的解释为:

序列化:把对象转换为字节序列的过程称为对象的序列化。

反序列化:把字节序列恢复为对象的过程称为对象的反序列化。


但是答案为:把普通内部类配置为静态内部类, 加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;
  }
}







请到「今天看啥」查看全文