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分钟,好好看看代码哦
运行之后发现会报:
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; } }
以上是编译后的内容,大家可以发现并没有零参数构造函数。这个就不能赖jackson返回缺少默认的构造函数了
- java基本知识
- 与小伙伴共勉的java有关jvm的知识(一),小鸟尽量写得详细哦,欢迎讨论,谢绝喷子
- JAVA学习笔记-加载窗口_画图形_编程中坐标基本知识
- java多线程相关知识
- Java基础知识 ——JDK,JRE和JVM
- 黑马程序员_Java入门必备知识
- 关于java的JIT知识
- JAVA知识积累 JSP第一篇【JSP介绍、工作原理、生命周期、语法、指令、行为】
- 基础小知识 - java 编码
- java基础知识回顾
- JAVA 国际化基础知识(二)
- JavaWeb基础知识day13——MVC思想&&MySQL事务与Java事务
- JAVA知识_2
- Java基础知识(二)
- Java基础知识(一)
- Java中基础知识
- Java基础知识强化40:StringBuffer类之StringBuffer的替换功能
- 【SD2.0大会】Java培训先驱张孝祥:Java开发中的基本安全知识
- 黑马程序员-1.java入门小知识
- Java基础知识强化之集合框架笔记26:LinkedList的特有功能