jackson 序列化?

2019-01-11 22:50:40 +08:00
 choice4
jackson 序列化是一种口头说法还是真的序列化呢?
class A implements Serializable{String s; B b; }
class B {String b;}
B b = new B("b");
A a = new A("a", b);
像这种类关系
如果
OutputStream s = new ObjectOutputStream(new FileOutputStream("./seria.txt"));
s.wirteObject(a);
就会明确抛出异常说明 B 类未实现序列化接口不可序列化,

但是像我用 jackson 的话
ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(s, a);
文件就能成功写进去。

这样的话 那么是 Jackson 底层做了什么小动作呢,还是说 jackson 这个不是真正的序列化呢
3612 次点击
所在节点    Java
20 条回复
falsemask
2019-01-11 22:52:19 +08:00
阿里的 fastjson 也是的
choice4
2019-01-11 22:54:22 +08:00
@falsemask 那么这些类实例转 json 字符串的库 。严格来说能叫序列化吗? 如果是序列化的话是什么机制保证了它没有抛出异常呢
falsemask
2019-01-11 22:59:29 +08:00
@choice4 fastjson 用了动态字节码技术
lhx2008
2019-01-11 23:11:58 +08:00
public class ObjectMapper extends ObjectCodec implements Versioned, Serializable

实现了 Serializable,Serializable 是把内存里面的东西转成可以存在硬盘上的,并且可以反操作,具体怎么实现没有标准。
choice4
2019-01-11 23:16:38 +08:00
@lhx2008 ObjectMapper 实现接口就能保障类实例通过序列化校验吗? 就像我题目上 A 类和 B 类, B 类作为 A 类的属性。A 类实现了序列化接口, B 类未实现序列化接口。去序列化 A 的时候也还是会报错啊
chendy
2019-01-11 23:20:38 +08:00
序列化 不一定序列化成什么,序列化成 json,xml,protobuffer,或者是(貌似)只有 java 认识的那种东西,都是序列化
Serializable 只是 java 自己的序列化,序列化称自己的格式(以及自己的逻辑)
choice4
2019-01-11 23:29:11 +08:00
@chendy 老哥我 get 不到你想回答的点。我主要是想知道一下。如果这些 json 序列化的库(此处就针对 json 说了,不论是不是其他格式)是 java 标准的序列化。为什么它可以将不实现 Serializable 接口的类的实例进行序列化呢。底层做了什么呢?还是说这个所谓的"json 序列化"就是一种说法(顺口易懂一些,本质上就没用 java 的序列化方法只是转了一下字符串呢)
我猜的应该是真正的序列化吧。但是想不到是什么机制将不实现序列化接口的类的实例进行序列化的呢
lhx2008
2019-01-11 23:38:44 +08:00
@choice4 我以为你说的用 JDK 的那个接口,writeValue 是 Jackson 自己的方法,他爱怎么实现就怎么实现呀,异常是 JDK 那个接口的。
lhx2008
2019-01-11 23:40:19 +08:00
序列化本质上只是一个接口,具体哪些成员变量序列化,都是自己定的,而不是说序列化是一个实现。
choice4
2019-01-11 23:40:52 +08:00
@lhx2008 那难道所谓的 jackson 序列化莫非就类似一个 toString 吗只不过是个 json 格式的?
lhx2008
2019-01-11 23:44:17 +08:00
@choice4 可以这么理解,因为 json 只有 文本和数字两种格式,他只管把你对象里面的成员变量转成文本或者数字就可以了,至于转回来怎么对应到对象,是你来规定的。
lhx2008
2019-01-11 23:53:05 +08:00
首先,序列化只管存到硬盘就行了,有很多种形式,一种是保存对象的一些二进制信息,一种是转成文本格式。

JDK 默认有一个序列化的方法,就是 Serializable 那一套,然后默认是会保存成二进制信息的,读回来会转回对象。当然也可以不按默认的方法,你可以自己写 writeObject 方法,像 HashMap 就有自己写一个。你想自己转成 json 格式都没问题的。

Jackson 没有用 JDK 那一套,他的序列化就是直接把成员变量转 json,不管你写没写 Serializable,他就用反射把你所有成员变量读出来就行了。
jinyang656
2019-01-12 00:22:15 +08:00
序列化是指:将内存中的对象、数据结构等转换为或用于存储或用于网络传输的字节或文本对象(多读几遍这句话)
所以 Serializable 是序列化,转换成 json 文本也是序列化
night98
2019-01-12 01:35:23 +08:00
jackson 应该是直接反射获取 bean 中属性值,Serializable 是 java 实现的一套二进制的序列化,方式不一样而已。
bengcaca
2019-01-12 08:43:34 +08:00
是 jackjson 吧?我说怎么越看越别扭
zhazi
2019-01-12 09:43:41 +08:00
你要用过 transient 就不会这么问了
VeryZero
2019-01-12 12:20:12 +08:00
你是不是对序列化一词有什么误解?

序列化是把对象转成可持久化保存的内(可以理解成字符串),同时还能反向转回来。

Serializable 只是 JAVA 的一种接口,你完全可以不用这个自己实现序列化,只要达到上述功能就行了。

所以怎么会有真序列化和假序列化的分别呢
choice4
2019-01-12 12:47:00 +08:00
gz911122
2019-01-12 15:21:03 +08:00
@bengcaca 是 Jackson
evilmiracle
2019-01-12 16:20:49 +08:00
fastjson 用的那个算法是什么算法来着?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/526225

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX