Serializeable

Java序列化

Java提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列化,该字节序列化包括该对象的数据,有关对象的类型的信息和存储在对象中的数据类型。
将序列化对象写入文件后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据,还有对象中的数据类型可用用来在内存中新建对象。
整个过程都是java虚拟机(JVM)独立的,也就是说,在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象。

一个类的对象想要序列化成功需要满足:

1、该类必须实现java.io.Serializable接口。
2、该类中所有属性必须是可序列化的,如果有一个属性不可序列化,则该属性必须注明是短暂的(transient)

注意

当序列化一个对象到文件时,按照Java的标准约定是给文件一个.ser扩展名(只是约定)

对于jvm可以反序列化对象,它必须是能够找到字节码的类,如果jvm在反序列化对象的过程中找不到该类,则抛出一个ClassNotFoundException异常。

@Data
@ToString
public class SerializeEntiy implements Serializable {

    private String name;

    private String address;

    private transient int SSN;

    private int number;

}

public class SerializeDemo {
    public static void main(String[] args) {
        //序列化
        serialize();
        //反序列化
        deserialization();
    }

    //反序列化
    private static void deserialization() {
        SerializeEntiy serialize = null;
        try {
            FileInputStream fileInput = new FileInputStream("/Users/Desktop/serilaize/serialize.ser");
            ObjectInputStream input = new ObjectInputStream(fileInput);
            serialize = (SerializeEntiy) input.readObject();
            input.close();
            fileInput.close();
            System.out.println(serialize);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    //序列化
    private static void serialize() {
        SerializeEntiy serialize = new SerializeEntiy();
        serialize.setName("序列化");
        serialize.setAddress("北京市朝阳区酒仙桥中路24号院");
        serialize.setNumber(878);
        serialize.setSSN(11);
        try {
            FileOutputStream fileOut = new FileOutputStream("/Users/Desktop/serilaize/serialize.ser");
            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            out.writeObject(serialize);
            out.close();
            fileOut.close();
            System.out.println("Serialized data is saved in /Users/qiangzhang/Desktop/serilaize/serialize.ser");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

字段无法序列化的几种场景:

1、静态变量不会序列化
2、transient关键字指定的属性
3、子类实现Serializable接口而父类没有实现时,父类中的属性是不会序列化的(父类实现了子类可以不用实现)
4、当序列化的类的serializversionUID 发生改变时,反序列化会失败

主流的序列化技术有哪些:

JSON/Hessian(2)/xml/protobuf/kryo/MsgPack/FST/thrift/protosbuff/Avro

FST/kryo不支持跨语言

实现工具:(因环境不同,测试结果也有不同)

性能分析图.png

JSON

        <!--   google     -->
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.2</version>
        </dependency>
        <!--   alibaba     -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.74</version>
        </dependency>

性能分析:(可能会有差)Google的Jackson的序列化性能比Alibaba的fastjson性能要好,Alibaba的fastjson的反序列化性能比Google的Jackson性能要好,各有长短

    public static void main(String[] args) throws IOException {

        excuteWithJackson();
        excuteWithFastJson();
    }

    //谷歌
    protected static void excuteWithJackson() throws IOException {
        User user = new User();
        user.setName("zhang");
        user.setAge(18);
        byte[] bytes = null;
        ObjectMapper objectMapper = new ObjectMapper();
        long start = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            bytes = objectMapper.writeValueAsBytes(user);

        }
        System.out.println("Jackson序列化,time:" + (System.currentTimeMillis() - start) + "ms,总大小->" + bytes.length);
        long start1 = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            User user1 = objectMapper.readValue(bytes, User.class);
        }
        System.out.println("Jackson反序列化,time:" + (System.currentTimeMillis() - start1) + "ms,总大小->" + bytes.length);

//        System.out.println(user1);
    }

    //alibaba
    protected static void excuteWithFastJson() {
        User user = new User();
        user.setName("zhang");
        user.setAge(18);
        String json = null;
        long start = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            json = JSON.toJSONString(user);
        }
        System.out.println("FastJson序列化,time:" + (System.currentTimeMillis() - start) + "ms,总大小->" + json.getBytes().length);
        long start1 = System.currentTimeMillis();

        for (int i = 0; i < 10000; i++) {
            User user1 = JSON.parseObject(json, User.class);
        }
        System.out.println("FastJson反序列化,time:" + (System.currentTimeMillis() - start1) + "ms,总大小->" + json.getBytes().length);
    }

结果:

Jackson序列化,time:60ms,总大小->25
Jackson反序列化,time:65ms,总大小->25
FastJson序列化,time:80ms,总大小->25
FastJson反序列化,time:40ms,总大小->25

protobuff(Google)

性能:压缩率高(字节数小),耗时短

        <dependency>
            <groupId>com.baidu</groupId>
            <artifactId>jprotobuf</artifactId>
            <version>2.4.4</version>
        </dependency>
  protected static void excuteWithProtoBuff() throws IOException {
        User user = new User();
        user.setName("zhang");
        user.setAge(18);
        byte[] encode = null;
        Codec<User> userCodec = ProtobufProxy.create(User.class, false);
        long start = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            encode = userCodec.encode(user);
        }
        System.out.println("ProtoBuff序列化,time:" + (System.currentTimeMillis() - start) + "ms,总大小->" + encode.length);
        long start1 = System.currentTimeMillis();

        for (int i = 0; i < 10000; i++) {
            User user1 = userCodec.decode(encode);
        }
        System.out.println("ProtoBuff反序列化,time:" + (System.currentTimeMillis() - start1) + "ms");
    }
ProtoBuff序列化,time:29ms,总大小->9
ProtoBuff反序列化,time:2ms

Hessian

性能:压缩率比较低(字节数大),时间短

        <dependency>
            <groupId>com.caucho</groupId>
            <artifactId>hessian</artifactId>
            <version>4.0.63</version>
        </dependency>
    protected static void excuteWithHessian() throws IOException {
        User user = new User();
        user.setName("zhang");
        user.setAge(18);
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        HessianOutput hessianOutput = new HessianOutput(os);
        long start = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            hessianOutput.writeObject(user);
            if(i == 1){
                System.out.println("总大小->" +os.toByteArray().length);
            }

        }
        System.out.println("Hessian序列化,time:" + (System.currentTimeMillis() - start) + "ms,");

        HessianInput hessianInput = new HessianInput(new ByteArrayInputStream(os.toByteArray()));

        long start1 = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            User user1 = (User)hessianInput.readObject();
        }
        System.out.println("Hessian反序列化,time:" + (System.currentTimeMillis() - start1) + "ms");
    }
总大小->61
Hessian序列化,time:2ms,
Hessian反序列化,time:5ms
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,012评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,628评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,653评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,485评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,574评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,590评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,596评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,340评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,794评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,102评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,276评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,940评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,583评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,201评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,441评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,173评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,136评论 2 352