java系列19:对象流

将对象写入到流,这个过程叫做序列化。
反之,称为反序列化。

如果要用于网络中传输的数据,则这些数据必须要实现序列化。

例1:

// Student.java

package test;

public class Student {
    String name;
    int age;
    String sex;

    public Student(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    public void study() {
        System.out.println("我在认真学习");
    }

    @Override
    public String toString() {
        return "我的名字:" + name + ",我的年龄:"
                + age + ",我的性别:" + sex;
    }
}

// Test.java

package test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

public class Test {
    public static void main(String[] args) {
        Student stu = new Student("李行之", 25, "男");
        File file = new File("a.txt");
        try {
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
            oos.writeObject(stu);
            oos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
运行结果,未进行序列化,因此无法将对象写入流中。13行:oos.writeObject(stu);

例2:

// 1. Student.java

package test;

import java.io.Serializable;

/*
 *  implements Serializable:实现序列化接口。
 *  它没有任何方法需要实现,只是一个标识。
 *  序列化之后,会有一个编号植入到对象中;当写入到磁盘时,会将编号一起写入磁盘。
 */
public class Student implements Serializable{
    String name;
    int age;
    String sex;
    // transient:不序列化某些属性
    transient long money = 10000000;

    public Student(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    public void study() {
        System.out.println("我在认真学习");
    }

    @Override
    public String toString() {
        return "我的名字:" + name + ",我的年龄:" 
                + age + ",我的性别:" + sex + ",我的钱:" + money;
    }
}

// 2. Test.java

package test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

/**
 * 序列化
 * @author xiangdonglee
 *
 */
public class Test {
    public static void main(String[] args) {
        Student stu = new Student("李行之", 25, "男");
        File file = new File("a.txt");
        if(!file.exists()) {
            try {
                file.createNewFile();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        try {
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
            oos.writeObject(stu);
            oos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
序列化结果
// 3.Test1.java

package test;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

/**
 * 反序列化
 * @author xiangdonglee
 *
 */
public class Test1 {
    public static void main(String[] args) {
        File file = new File("a.txt");
        if(file.exists()) {
            try {
                ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
                Student stu = (Student) ois.readObject();
                System.out.println(stu);
                ois.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
transient修饰的money属性没有被序列化
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,785评论 18 399
  • 一. Java基础部分.................................................
    wy_sure阅读 3,840评论 0 11
  • 面向对象主要针对面向过程。 面向过程的基本单元是函数。 什么是对象:EVERYTHING IS OBJECT(万物...
    sinpi阅读 1,096评论 0 4
  • 跑操回来补了觉,打扫宿舍卫生。下午就直接去开黑了,今天居然也没输。。。晚上回来又在宿舍观战,相当丑陋的比赛,pat...
    AJI米阅读 142评论 0 0
  • 今天继续分享【得到】App付费专栏李笑来的《通往财富自由之路》,第十六周内容——《看得见别人的好才能获得新生》。 ...
    注册营养师阿娟阅读 1,046评论 4 7