JAVA序列化:Java中对象的序列化指的是将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的数据和信息,一个序列化后的对象可以被写到数据库或文件中,也可用于网络传输,一般当我们使用缓存cache(内存空间不够有可能会本地存储到硬盘)或远程调用rpc(网络传输)的时候,经常需要让我们的实体类实现Serializable接口,目的就是为了让其可序列化。
当然,序列化后的最终目的是为了反序列化,恢复成原先的Java对象。所以序列化后的字节序列都是可以恢复成Java对象的,这个过程就是反序列化。
往往存在这样的场景,一个类中有些参数被序列化毫无意义。序列化只会增加磁盘或者网络传输的大小。一个类中有些敏感信息,比如密码等。序列化后安全性降低。一个类中存在某个对象无法被序列化。而这个对象来自框架或者系统层面。这个时候我们可以使用transient关键字。实现部分序列化。transient关键字主要作用是:当对象被序列化时(写入字节序列到目标文件)时,transient阻止实例中那些用此关键字声明的变量持久化;当对象被反序列化时(从源文件读取字节序列进行重构),这样的实例变量值不会被持久化和恢复。
示例:
这里有一个Company类:
public class Company implements Serializable{
private String companyName;
private String companyAddress;
private String companyEmail;
private transient List<Employee> employees;
public Company(String companyName, String companyAddress, String companyEmail, List<Employee> employees) {
this.companyName = companyName;
this.companyAddress = companyAddress;
this.companyEmail = companyEmail;
this.employees = employees;
}
}
有一个Employee类
public class Employee implements Serializable{
private String Name;
private String phone;
public Employee(String name, String phone) {
Name = name;
this.phone = phone;
}
}
测试方法:
public class TestSerializable {
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
Employee employee1 = new Employee("张三","1234");
Employee employee2 = new Employee("张四","1234");
Employee employee3 = new Employee("张五","1234");
List<Employee> employees = new ArrayList();
employees.add(employee1);
employees.add(employee2);
employees.add(employee3);
Company company = new Company("百度","百度大厦","3333",employees);
ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("rectangle"));
// 往流写入对象
o.writeObject(company);
o.close();
System.out.println("反序列化之前的雇员" + company.getEmployees());
// 从流读取对象
ObjectInputStream in = new ObjectInputStream(new FileInputStream("rectangle"));
Company company1 = (Company)in.readObject();
System.out.println("反序列化之后的雇员" + company1.getEmployees());
}
}
我们都知道如果Employee没有实现Serializable。这样序列化Company的时候,会抛出异常 java.io.NotSerializableException。这是因为无法序列化Company中变量Employee。但是使用transient可以实现部分序列化。