java序列化与反序列化

来源:互联网 发布:搜索算法的主要特征 编辑:程序博客网 时间:2024/05/22 04:49

在每一个对象中,都蕴含着这个对象的状态,比如说有这样一个类:

public class Student {private Integer Id;private String name;public Integer getId() {return Id;}public void setId(Integer id) {Id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}
这时候有这么一个测试类,给了id一个值:1
public class Test {public static void main(String[] args) {Student student = new Student();student.setId(1);}}

如果这时候不用序列化的话,那么这个1无法存储,如果你把电源关了,测试类去掉,这个1不会被保存下来,也就是说这个对象的状态无法保存,

但是如果你实现了序列化的接口,如下:

import java.io.Serializable;public class Student implements Serializable{/** * 序列化ID */private static final long serialVersionUID = 1L;private Integer Id;private String name;public Integer getId() {return Id;}public void setId(Integer id) {Id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}
这个值就可以保存下来,它可以保存在你的硬盘中,或者是转换成流的形式在网络中传输,只要你通过反序列化,就可以继续得到这个值1,也就是说回到它保存时的状态

另外,可以通过transient这个关键字让这个字段不去序列化,如下所示:List源码里面就是采取这种方式让里面的元素不去序列化,试想一下,假设list不这样设计,那么里面的元素全部被保存,这要占用多大的内容,序列化后的字节码会有多大

import java.io.Serializable;public class Student implements Serializable{/** * 序列化ID */private static final long serialVersionUID = 1L;private transient Integer Id;private String name;public Integer getId() {return Id;}public void setId(Integer id) {Id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}


总结:序列化就是把对象转化为可以存储传输的字节码,它的作用是保存对象的状态,反序列化则反之。

原创粉丝点击