我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable接口,这个类的所有属性和方法都会自动序列化。
序列化是编程的一种解决问题的方式。JAVA序列化就是将对象按照某种协议格式(某种约定方式)放入一个buffer中,其目的是便于网络传输或持久存储。反序列化,就是将序列化后的buffer按照序列化时还原成原来的对象,这样程序就能直接使用还原的对象了。
实例:
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; /** * * @Description :Serializable关键字 * @author Bush罗 * @date 2018年5月12日 * */ public class Main { public static void main(String[] args) throws IOException, ClassNotFoundException { // TODO Auto-generated method stub createObj(); readObj(); } //(一)先写入对象 public static void createObj() throws IOException { //1.创建目标路径 File file = new File("D:/objTest.txt"); //2.创建流通道 FileOutputStream fos = new FileOutputStream(file); //3.创建对象输出流 ObjectOutputStream objOP = new ObjectOutputStream(fos); //4.创建类对象,并初始化 Student stu = new Student("bushluo", "password"); //5.向目标路径文件写入对象 objOP.writeObject(stu); //6.关闭资源 objOP.close(); } //再读取对象 public static void readObj() throws IOException, ClassNotFoundException { File file = new File("D:/objTest.txt"); FileInputStream fis = new FileInputStream(file); ObjectInputStream objIP = new ObjectInputStream(fis); //读取对象数据,需要将对象流强制转换为 要写入对象的类型 Student stu = (Student)objIP.readObject(); System.out.println("name:"+stu.name+"\npassword:"+stu.password); objIP.close(); } } //创建要写入磁盘的类,这个类需要实现接口 Serializable(可系列化的) class Student implements Serializable{ //在这里保证了serialVersionUID 的唯一性,防止属性变量的临时改变,从而造成写入id与读取id不同 private static final long serialVersionUID = 1L; String name ; String password; //transient String password; //transient修饰属性,表示暂时的,则这个属性不会被写入磁盘 public Student(String name, String password) { super(); this.name = name; this.password = password; } }
这样对象对可以通过流来传输,先把对象序列化然后写入txt文件中,然后反序列化读取出来。
private static final long serialVersionUID = 1L;
这句话的作用相当于是为这个类做上版本标记,如果在反序列化之前,该类的属性值有变动,那么反序列化时还是用序列化时的版本,属性值还是没有改动之前的,防止了数据被脏读。
如果一个有一些敏感信息(如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输,这些信息对应的变量就可以加上transient关键字。这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。
对象的序列化可以通过实现两种接口来实现,若实现的是Serializable接口,则所有的序列化将会自动进行,若实现的是Externalizable接口,则没有任何东西可以自动序列化,需要在writeExternal方法中进行手工指定所要序列化的变量,这与是否被transient修饰无关。