美文网首页
五、文件传输基础-序列化

五、文件传输基础-序列化

作者: Lord丶轩莫言弃 | 来源:发表于2019-07-23 10:50 被阅读0次

1、对象的序列化和反序列化

  • 对象序列化,就是将Object转换成byte序列,反之叫对象的反序列化
  • 序列化流(ObjectOutputStream),是字节过滤流---writerObject
  • 反序列化流(ObjectInPutStream),---readObject
  • 序列化接口( Serializable)
  • 对象必须实现序列化接口,才能进行序列化,否则将出现异常,这个接口没有任何方法,只是一个标准。

2、对象序列化,代码示例:

package com.lord.quick;

import java.io.Serializable;

public class Student implements Serializable {

    private static final long serialVersionUID = 6780974907389412343L;

    private String number;
    private String username;
    private int age;

    public Student() {
    }

    public Student(String number, String username, int age) {
        super();
        this.number = number;
        this.username = username;
        this.age = age;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    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;
    }

    @Override
    public String toString() {
        return "Student [number=" + number + ", username=" + username + ", age=" + age + "]";
    }

}

public static void main(String[] args) throws Exception {
    String file = "demo/obj.dat";
    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
    Student stu = new Student("10001", "张三", 20);
    oos.writeObject(stu);
    oos.flush();
    oos.close();
}

3、对象反序列化,代码示例:

public static void main(String[] args) throws Exception {
    String file = "demo/obj.dat";      
    ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
    Student stu = (Student)ois.readObject();
    System.out.println(stu);
    ois.close();
}

4、transient关键字

  • transient表示类的属性不被序列化
package com.lord.quick;

import java.io.Serializable;

public class Student implements Serializable {

    private static final long serialVersionUID = 6780974907389412343L;

    private String number;
    private String username;
    private transient int age; // 该元素不会进行jvm默认的序列化,也可以自己完成序列化

    public Student() {
    }

    public Student(String number, String username, int age) {
        super();
        this.number = number;
        this.username = username;
        this.age = age;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    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;
    }

    @Override
    public String toString() {
        return "Student [number=" + number + ", username=" + username + ", age=" + age + "]";
    }

}

5、自主完成序列化,代码示例

  • 此处参考ArrayList类源码序列化和反序列化的实现
  • 自主实现序列化和反序列化可提供程序性能
package com.lord.quick;

import java.io.Serializable;

public class Student implements Serializable {

    private static final long serialVersionUID = 6780974907389412343L;

    private String number;
    private String username;
    private transient int age;

    public Student() {
    }

    public Student(String number, String username, int age) {
        super();
        this.number = number;
        this.username = username;
        this.age = age;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    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;
    }

    @Override
    public String toString() {
        return "Student [number=" + number + ", username=" + username + ", age=" + age + "]";
    }

    // 序列化
    private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException {
        s.defaultWriteObject();// 把jvm能默认序列化的元素进行序列化

        s.writeInt(age);
    }

    // 反序列化
    private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException {
        s.defaultReadObject();// 把jvm能默认反序列化的元素进行反序列化

        this.age = s.readInt();
    }

}

6、序列化中子父类构造函数问题

  • 一个类实现了序列化接口,其子类都可以进行序列化
  • 创建对象时,递归调用父类的构造函数
  • 对子类对象进行反序列化操作时,如果其父类没有实现序列化接口,那么其父类的构造函数会被显示调用

相关文章

  • 五、文件传输基础-序列化

    1、对象的序列化和反序列化 对象序列化,就是将Object转换成byte序列,反之叫对象的反序列化 序列化流(Ob...

  • Java-序列化-反序列化

    Thanks Java基础学习总结——Java对象的序列化和反序列化java序列化反序列化原理Java 序列化的高...

  • Java序列化

    Java序列化的几种方式以及序列化的作用 Java基础学习总结——Java对象的序列化和反序列化

  • 序列化

    序列化 学习资料 Java对象的序列化与反序列化-HollisChuang’s Blog 《成神之路-基础篇》Ja...

  • 序列化与反序列化

    Java基础学习总结——Java对象的序列化和反序列化 一、序列化和反序列化的概念 把对象转换为字节序列的过程称为...

  • 序列化

    序列化方式 1、Java序列化技术 1.1基础概念 Java 序列化是指把 Java 对象转换为字节序列的过程;(...

  • Spark序列化

    Java序列化 有关Java对象的序列化和反序列化也算是Java基础的一部分,首先对Java序列化的机制和原理进行...

  • 总结

    java基础 Java中多态的理解 反射 Java序列化与反序列化 Volatile和Synchronized e...

  • 第5讲 文件传输

    本章主要内容: 文件的基础知识 Netty文件传输开发 5.1 文件基础知识 Java NIO中的FileChan...

  • JavaSE笔记(五)文件传输基础IO流

    文件的编码 File类 RandomAccessFile IO流分为输入流、输出流 还有字节流、字符流 Buffe...

网友评论

      本文标题:五、文件传输基础-序列化

      本文链接:https://www.haomeiwen.com/subject/mvfolctx.html