1
falsemask 2019-01-11 22:52:19 +08:00
阿里的 fastjson 也是的
|
2
choice4 OP @falsemask 那么这些类实例转 json 字符串的库 。严格来说能叫序列化吗? 如果是序列化的话是什么机制保证了它没有抛出异常呢
|
4
lhx2008 2019-01-11 23:11:58 +08:00
public class ObjectMapper extends ObjectCodec implements Versioned, Serializable
实现了 Serializable,Serializable 是把内存里面的东西转成可以存在硬盘上的,并且可以反操作,具体怎么实现没有标准。 |
5
choice4 OP @lhx2008 ObjectMapper 实现接口就能保障类实例通过序列化校验吗? 就像我题目上 A 类和 B 类, B 类作为 A 类的属性。A 类实现了序列化接口, B 类未实现序列化接口。去序列化 A 的时候也还是会报错啊
|
6
chendy 2019-01-11 23:20:38 +08:00
序列化 不一定序列化成什么,序列化成 json,xml,protobuffer,或者是(貌似)只有 java 认识的那种东西,都是序列化
Serializable 只是 java 自己的序列化,序列化称自己的格式(以及自己的逻辑) |
7
choice4 OP @chendy 老哥我 get 不到你想回答的点。我主要是想知道一下。如果这些 json 序列化的库(此处就针对 json 说了,不论是不是其他格式)是 java 标准的序列化。为什么它可以将不实现 Serializable 接口的类的实例进行序列化呢。底层做了什么呢?还是说这个所谓的"json 序列化"就是一种说法(顺口易懂一些,本质上就没用 java 的序列化方法只是转了一下字符串呢)
我猜的应该是真正的序列化吧。但是想不到是什么机制将不实现序列化接口的类的实例进行序列化的呢 |
8
lhx2008 2019-01-11 23:38:44 +08:00
@choice4 我以为你说的用 JDK 的那个接口,writeValue 是 Jackson 自己的方法,他爱怎么实现就怎么实现呀,异常是 JDK 那个接口的。
|
9
lhx2008 2019-01-11 23:40:19 +08:00
序列化本质上只是一个接口,具体哪些成员变量序列化,都是自己定的,而不是说序列化是一个实现。
|
10
choice4 OP @lhx2008 那难道所谓的 jackson 序列化莫非就类似一个 toString 吗只不过是个 json 格式的?
|
11
lhx2008 2019-01-11 23:44:17 +08:00
@choice4 可以这么理解,因为 json 只有 文本和数字两种格式,他只管把你对象里面的成员变量转成文本或者数字就可以了,至于转回来怎么对应到对象,是你来规定的。
|
12
lhx2008 2019-01-11 23:53:05 +08:00
首先,序列化只管存到硬盘就行了,有很多种形式,一种是保存对象的一些二进制信息,一种是转成文本格式。
JDK 默认有一个序列化的方法,就是 Serializable 那一套,然后默认是会保存成二进制信息的,读回来会转回对象。当然也可以不按默认的方法,你可以自己写 writeObject 方法,像 HashMap 就有自己写一个。你想自己转成 json 格式都没问题的。 Jackson 没有用 JDK 那一套,他的序列化就是直接把成员变量转 json,不管你写没写 Serializable,他就用反射把你所有成员变量读出来就行了。 |
13
jinyang656 2019-01-12 00:22:15 +08:00
序列化是指:将内存中的对象、数据结构等转换为或用于存储或用于网络传输的字节或文本对象(多读几遍这句话)
所以 Serializable 是序列化,转换成 json 文本也是序列化 |
14
night98 2019-01-12 01:35:23 +08:00
jackson 应该是直接反射获取 bean 中属性值,Serializable 是 java 实现的一套二进制的序列化,方式不一样而已。
|
15
bengcaca 2019-01-12 08:43:34 +08:00
是 jackjson 吧?我说怎么越看越别扭
|
16
zhazi 2019-01-12 09:43:41 +08:00 via Android
你要用过 transient 就不会这么问了
|
17
VeryZero 2019-01-12 12:20:12 +08:00
你是不是对序列化一词有什么误解?
序列化是把对象转成可持久化保存的内(可以理解成字符串),同时还能反向转回来。 Serializable 只是 JAVA 的一种接口,你完全可以不用这个自己实现序列化,只要达到上述功能就行了。 所以怎么会有真序列化和假序列化的分别呢 |
20
evilmiracle 2019-01-12 16:20:49 +08:00
fastjson 用的那个算法是什么算法来着?
|