一、什么是序列化
In computer science, in the context of data storage, serialization is the process of translating data structures or object state into a format that can be stored (for example, in a file or memory buffer, or transmitted across a network connection link) and reconstructed later in the same or another computer environment.[1] When the resulting series of bits is reread according to the serialization format, it can be used to create a semantically identical clone of the original object.

那我也有看过很多的博客包括书,但是我之前其实一直不太理解这个序列化,虽然一直都在用。今天在看资料 的时候,发现导致这种现象的原因,可能是我之前看的一些介绍里面,忽略了一个很关键的因素:object state info对象的状态信息 。也就是说,其实序列化,它是完整的保存了某一状态下的对象信息,是一个整体,而不是零散的!我在一个IBM工程师的博客里面看到一个说法,我感觉对于我理解序列化很有帮助,他说序列化的过程,就是一个“freeze”的过程,它将一个对象freeze住,然后进行存储,等到再次需要的时候,再将这个对象de-freeze就可以立即使用。

二、为什么需要序列化
1,存储对象在存储介质中,以便在下次使用的时候,可以很快捷的重建一个副本。也就是When the resulting series of bits is reread according to the serialization format, it can be used to create a semantically identical clone of the original object.

问题:我没有实现序列化的时候,我一样可以存入到我的sqlserver或者MySQL、Oracle数据库中啊,为什么一定要序列化才能存储呢????

2,便于数据传输,尤其是在远程调用的时候!

三、到底什么时候一定要序列化

结合到第二点的问题,就是说在我存储的时候,不通过序列化也一样完美存储,为什么要多此一举?额,经过我阅读文档和书籍,以及做项目的经验总结(反正就是之前混迹在编码中的一系列经验总结),在存储时需要序列化,这是肯定的。大家知道的是序列化是将对象进行流化存储,我们有时候感觉自己在项目中并没有进行序列化操作,也一样是存进去了,那么对象需要经过序列化才能存储的说法,似乎从这儿就给阉割了。事实究竟是怎样的呢?

首先看我们常用的数据类型类声明:

public final class String implements java.io.Serializable, Comparable<String>, CharSequence
public class Date implements java.io.Serializable, Cloneable, Comparable

而像其他int、long、boolean类型等,都是基本数据类型,数据库里面有与之对应的数据结构。从上面的类声明来看,我们以为的没有进行序列化,其实是在声明的各个不同变量的时候,由具体的数据类型帮助我们实现了序列化操作。
拿到这儿的时候,就又有一个问题,既然实体类的变量都已经帮助我们实现了序列化,为什么我们仍然要显示的让类实现serializable接口呢?

请注意我以上的说法:首先,序列化的目的有两个,第一个是便于存储,第二个是便于传输。我们一般的实体类不需要程序员再次实现序列化的时候,请想两个问题:第一:存储媒体里面,是否是有其相对应的数据结构?第二:这个实体类,是否需要远程传输(或者两个不同系统甚至是分布式模块之间的调用)?

如果有注意观察的话,发现序列化操作用于存储时,一般是对于NoSql数据库,而在使用Nosql数据库进行存储时,用“freeze”这个说法来理解是再恰当不过了,请在NoSql数据库中,给我找出个varchar,int之类的数据结构出来? 如果没有,但我们又确实需要进行存储,那么,此时程序员再不将对象进行序列化,更待何时?

备注:如果有人打开过Serializable接口的源码,就会发现,这个接口其实是个空接口,那么这个序列化操作,到底是由谁去实现了呢?其实,看一下接口的注释说明就知道,当我们让实体类实现Serializable接口时,其实是在告诉JVM此类可被序列化,可被默认的序列化机制序列化。

然后,需要说明的是,当我们在实体类声明实现Serializable接口时,再次进行观察,会发现这些类是需要被远程调用的。也就是说需要或者可能需要被远程调用,这就是序列化便于传输的用途。

慎重声明:以上所有言论,都是本宝宝经过项目中的具体观察,以及阅读一些文章之后的所谓经验之谈,且看且见谅吧!

三、是否一定要实现Serializable接口序列化
上回说到了关于序列化的一些基本情况,那么,接下来的一个问题是:如果我们要实现序列化操作,是否一定要通过实现Serializable接口的方式?PS:其实,我只是不明白,为什么大家一提到序列化就说特别简单,实现Serializable接口就OK了?我就一直在想,这是否是目前我们所能拥有的最佳选择?

请大家先看一篇文章分析:https://github.com/eishay/jvm-serializers/wiki

四、使用其他序列化实现的优缺点
诚如大家在第三节分享的链接文章所见,通过实现Serializable接口的方式去进行序列化操作,在性能上来讲并不是最佳选择。那么,在性能考虑的情况下,很多人都会选择其他更为高效率的产品替代serializable接口,现在问题来了:

1,如果我通过Serializable接口实现,那么我只需要在类声明时实现它即可

2,如果我通过其他方式实现,那么我将不得不自己重写工具类,不能再通过实现serializable接口的方式去进行序列化了。在使用上,大大的不怎么方便!

PS:项目中总会用到个什么redis,mongoDB啥的,其实每次存取都有那么一个数据封装处理的过程,额,也差不了这一点了。那么有没有现成的人家封装好的呢?自己找吧,肯定是有的。其实,我就是不明白,如果是用了第三方的工具去实现序列化,那么在序列化进行远程调用的时候,到底应该在哪儿进行显示的序列化或者反序列操作?我刚开始想在Dao层,但这样子的话,自己模块操作不也得来那么一波序列化反序列化操作嘛。因为我目前确实只是在从NoSql数据库中存取数据时用到了第三方的序列化工具。

转载自谈谈序列化—实体bean一定要实现Serializable接口?

Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.apache.catalina.connector.CoyoteWriter and no properties discovered to create BeanSerializer的更多相关文章

  1. com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class cn.edu.

    详细信息   https://www.cnblogs.com/xuwenjin/p/8832522.html 解决办法: 在实体类上面加上注解 @JsonIgnoreProperties(value ...

  2. Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException

    实体类缺少无参构造方法,序列化对象需要无参构造方法 @NoArgsConstructor

  3. jackon - com.fasterxml.jackson.databind.exc.InvalidDefinitionException && UnrecognizedPropertyException: Unrecognized field 异常

    在用jackson解析json数据是碰到的问题 1.首先是InvalidDefinitionException 测试发现可能是目标类中无无参数构造方法导致异常. 添加无参构造方法后发现前一个异常解决但 ...

  4. Spring Boot在反序列化过程中:jackson.databind.exc.InvalidDefinitionException cannot deserialize from Object value

    错误场景 用Spring boot写了一个简单的RESTful API,在测试POST请求的时候,request body是一个符合对应实体类要求的json串,post的时候报错. 先贴一段error ...

  5. com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field 异常

    分享牛原创(尊重原创 转载对的时候第一行请注明,转载出处来自分享牛http://blog.csdn.net/qq_30739519) 1.1.1. 前言 近期在使用ObjectMapper对象将jso ...

  6. JSON parse error: Cannot deserialize instance of `int` out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.exc

    代码程序: @PostMapping("selectById") @ResponseBody public Result selectById(@RequestBody int i ...

  7. com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "ExceptionId"

    com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "Exception ...

  8. com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "FileSize"

    请求阿里云的OSS接口图片信息,返回json格式的数据,通过ObjectMapper将json转为Image对象时候报错转换失败 将json转对象的代码: String jsonStr = " ...

  9. jackson json转实体对象 com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException

    Jackson反序列化错误:com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field的解 ...

随机推荐

  1. PythonDay04

    ## 第四章 ### 今日内容 - 列表- 元组- range ### 列表 列表相比于字符串,不仅可以储存不同的数据类型,而且可以储存大量数据,是一种可变的数据类型 64位python的限制是 11 ...

  2. 用CSS来定义<p>标签,要求实现以下效果:字体颜色再IE6下为黑色,IE7下为红色,IE8下为绿色,其他浏览器下为黄色。

    <!DOCTYPE html><html><head><meta charset="utf-8"><meta name=&qu ...

  3. web面试

    什么是面向对象? 程序中的事物都是用对象结构来描述的,所有的程序都是用面向对象的思想,管理数据和功能的. 面向对象三大特点:封装 继承 多态 什么是封装? 创建一个对象结构,用来保存一个事物的属性和方 ...

  4. xtuils

    xutils的使用必须导入一个依赖 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceS ...

  5. 100天搞定机器学习|Day23-25 决策树及Python实现

    算法部分不再细讲,之前发过很多: [算法系列]决策树 决策树(Decision Tree)ID3算法 决策树(Decision Tree)C4.5算法 决策树(Decision Tree)CART算法 ...

  6. websql操作类封装

    在之前,我写了一个websql的封装类库,代码如下: (function(win) { function smpWebSql(options){ options = options || {}; th ...

  7. 从零写一个编译器(十一):代码生成之Java字节码基础

    项目的完整代码在 C2j-Compiler 前言 第十一篇,终于要进入代码生成部分了,但是但是在此之前,因为我们要做的是C语言到字节码的编译,所以自然要了解一些字节码,但是由于C语言比较简单,所以只需 ...

  8. 快速了解Python并发编程的工程实现(下)

    关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...

  9. bootstrap-datetimepicker时间插件使用

    html头部引入相关的js和css <link rel="stylesheet" type="text/css" href="css/boots ...

  10. idea中pom如何加载jar包依赖

    1.需求分析    在特定需求的情况下,idea需要加载jar包,那么如何在idea中正确的配置jar依赖呢?今天博主就这个问题给大伙讲解下,希望对大伙有所帮助 2.实现方案①在工程src目录下新建l ...