JAVA序列化

序列化

概念:将内存中保存的对象变为二进制流进行输出或保存在文本中(即将对象变为二进制流)

要想让类支持序列化,必须实现Serializable接口(标识接口,只有实现了Serializable接口的类,才具有对象序列化的功能)

具体实现序列化,需要使用io包中提供的两个处理类:

    ObjectOutputStream:(序列化类)

public ObjectOutputStream(OutputStream out) throws IOException

主要方法:writeObject(Object Object)---将obj变为二进制流输出到目标终端(终端在构造方法中提供)

    ObjectInputStream:(反序列化类)

public ObjectInputStream(InputStream in) throws IOException
主要方法:readObject()---将二进制流变为Object对象

一、序列化

class Person implements Serializable {
    private String name;
    private Integer age;
    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
public class Test {
    public static void main(String[] args) throws Exception{
        File file = new File("D:test.txt");
        Person p = new Person("Tom",20);
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        ObjectOutputStream oos = new ObjectOutputStream(fileOutputStream);
        oos.writeObject(p);
        oos.close();
    }
}

将一个对象进行序列化,Person类实现了Serializable接口,在主方法中通过ObjectOutputStream中的writeObject方法来进行序列化.这里在D盘创建了一个名为test.txt的文件,将序列化的二进制流保存到了文件中.我们可以看一下这个文件

二、反序列化

既然有序列化就肯定有反序列化,可以将二进制流变成java的对象,具体实现:

class Person implements Serializable {
    private String name;
    private Integer age;
    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
public class Test {
    public static void main(String[] args) throws Exception{
        File file = new File("D:test.txt");
        FileInputStream fileInputStream = new FileInputStream(file);
        ObjectInputStream ois = new ObjectInputStream(fileInputStream);
        Person p = (Person)ois.readObject();
        System.out.println(p);
        ois.close();
    }
}

这个方法可以从文件中读取二进制流并将其变为Person对象,输出结果为

可以看到与存进去的对象的值完全一样.

三、transient关键字

若希望类中的若干属性不被序列化,可以在属性前添加transient关键字,有transient关键字的属性在对象进行序列化时并不会保存到二进制流中。

比如我将Person类中的age属性加上transient关键字,再进行序列化

打开保存的test.txt文件

可以看到内容明显比之前的少了很多,再使用这个文件进行反序列化,输出得到的Person类的对象

可以看到age的属性值为空,说明age属性的值并没有保存到二进制流中.这就是transient关键字的作用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值