ZooKeeper 源码分析(一)

序列化与反序列化

  • 序列化目的
    • 序列化:将对象的状态信息转换为可以存储或传输的形式的过程。
    • 反序列化:将磁盘或者网络传输过来的信息转换为对象。
  • 序列化标准
    • 是否支持跨语言
    • 编码后的码流大小
    • 序列化过程的性能

java序列化与反序列化Demo

package org.apache.zookeeper.demo;

import java.io.Serializable;

/**
 * Created by caomaoboy 2019-11-14
 **/
public class Student implements Serializable {
    @Override
    public String toString() {
        return "Student{" +
                "username='" + username + '\'' +
                ", age=" + age +
                ", grade=" + grade +
                '}';
    }

    public Student(String username, int age, int grade){
        this.username = username;
        this.age = age;
        this.grade = grade;

    }
    private static final long serialVersionUID = 1L;
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public long getGrade() {
        return grade;
    }

    public void setGrade(long grade) {
        this.grade = grade;
    }

    private String username;
    private int age;
    private long grade;
}
public class SerialDemo {
    @Test
    public void  test() throws IOException, ClassNotFoundException {
        Student student = new Student("zhangsan",13,6);
        ObjectOutputStream oos;
        String path="demo.txt";
        oos = new ObjectOutputStream(new FileOutputStream(new File(path)));
        oos.writeObject(student);
        System.out.println("---------java serialize---------");


        ObjectInputStream ois;
        ois = new ObjectInputStream(new FileInputStream(new File(path)));
        Student obj;
        obj = (Student) ois.readObject();
        System.out.println("ojg = "+obj.toString());


    }
}

在这里插入图片描述
从上图可以看到,类的序列化文件存储了包括。

  • 类的全路径
  • 类的名称
  • 成员变量名称
  • 成员变量的值

Jute序列化

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

 @Test
    public void tesjute(){
        Student student = new Student("zhangsan",13,6);
        ObjectOutputStream oos;
        String path="demojute.txt";
        InputStream inputStream;
        OutputStream outputstream ;
        try {
            outputstream= new FileOutputStream(new File(path));
            BinaryOutputArchive binaryOutputArchive =BinaryOutputArchive.getArchive(outputstream);
            binaryOutputArchive.writeString(student.getUsername(),"name");
            binaryOutputArchive.writeInt(student.getAge(),"age");
            binaryOutputArchive.writeLong(student.getGrade(),"grade");
            outputstream.flush();
            outputstream.close();

            InputStream inputstream;
            inputstream = new FileInputStream(new File(path));
            BinaryInputArchive binaryInputArchive =BinaryInputArchive.getArchive(inputstream);
            System.out.println("username=" + binaryInputArchive.readString("name"));
            System.out.println("userage=" + binaryInputArchive.readInt("age"));
            System.out.println("usergrade=" + binaryInputArchive.readLong("grade"));






        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }

Zookeeper使用的是Jute反序列化。经过反序列化后的存储在这里插入图片描述

使用java 序列化的文件
在这里插入图片描述
可以看出zookeeper使用了更少的字节 只保留了序列化字段的值,这样会有更好的性能。

总结

  • Java序列化
    • 只支持java
    • 序列化后包含的 全路径名称、各成员变量名称、成员变量值
  • Jute序列化
    • 支持跨语言(C++ C# java等)
    • 序列化后只包含成员变量值 (序列化性能更好)
发布了67 篇原创文章 · 获赞 5 · 访问量 3184

猜你喜欢

转载自blog.csdn.net/weixin_41315492/article/details/103065789