V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
JohnZorn
V2EX  ›  Java

jackson 序列化?

  •  
  •   JohnZorn · Jan 11, 2019 · 4217 views
    This topic created in 2668 days ago, the information mentioned may be changed or developed.
    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 这个不是真正的序列化呢
    Supplement 1  ·  Jan 12, 2019
    Serializable 适用于对 java 对象的序列化,ObjectMapper 所做的是将 java 对象转化为字符串( String )。String 实现了序列化接口,所以实际是对 String 进行的序列化。应该是这个了。
    20 replies    2019-01-12 16:20:49 +08:00
    falsemask
        1
    falsemask  
       Jan 11, 2019
    阿里的 fastjson 也是的
    JohnZorn
        2
    JohnZorn  
    OP
       Jan 11, 2019
    @falsemask 那么这些类实例转 json 字符串的库 。严格来说能叫序列化吗? 如果是序列化的话是什么机制保证了它没有抛出异常呢
    falsemask
        3
    falsemask  
       Jan 11, 2019
    @choice4 fastjson 用了动态字节码技术
    lhx2008
        4
    lhx2008  
       Jan 11, 2019
    public class ObjectMapper extends ObjectCodec implements Versioned, Serializable

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

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

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

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

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

    所以怎么会有真序列化和假序列化的分别呢
    JohnZorn
        18
    JohnZorn  
    OP
       Jan 12, 2019
    gz911122
        19
    gz911122  
       Jan 12, 2019
    @bengcaca 是 Jackson
    evilmiracle
        20
    evilmiracle  
       Jan 12, 2019
    fastjson 用的那个算法是什么算法来着?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1121 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 136ms · UTC 17:30 · PVG 01:30 · LAX 10:30 · JFK 13:30
    ♥ Do have faith in what you're doing.