上一篇小作文,我们介绍了什么是序列化 认识序列化。下面我们谈一谈,Java 序列化的注意事项。
1.静态变量
静态变量不能被序列化。序列化保存的是对象状态,静态变量保存的是类状态,因此序列化并不保存静态变量。
2.Transient 关键字
transient 关键字的作用是阻止变量的序列化,变量声明时加上该关键字,变量将不再是对象持久化的一部分,该变量内容在序列化后无法被访问,即反序列化后,transient变量的值被设为初始值,如 int 类型的是 0,对象类型的是 null
transient关键字只能修饰变量,而不能修饰方法和类。本地变量是不能被transient关键字修饰的。
3.父类序列化
1. 当一个父类没有实现序列化时,子类继承该父类并且实现了序列化。在反序列化该子类后,无法获取到父类的属性值
2. 当一个父类实现序列化,子类自动实现序列化,不需要再显示实现Serializable 接口
3. 当一个对象的实例变量引用了其他对象,序列化该对象时也会把引用对象进行序列化,前提是该引用对象必须实现序列化接口
如果想要写 序列化的 测试用例的话,可以通过 ObjectOutputStream、ObjectInputStream来实现。
import org.junit.Test;
import java.io.*;
/**
* @author hui
* @descption
* @date 2022/6/16 7:24
*/
public class SerializerUtil {
private SerializerUtil() {
}
/**
* 序列号
* @param obj
* @param <T>
* @return
*/
public static <T> byte[] serialize(T obj) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream)){
objectOutputStream.writeObject(obj);
} catch (IOException e) {
e.printStackTrace();
}
return byteArrayOutputStream.toByteArray();
}
/**
* 反序列号
* @param data
* @param clazz
* @param <T>
* @return
*/
public static <T> T deserialize(byte[] data, Class<T> clazz) {
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data);
try (ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream)){
return (T) objectInputStream.readObject();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
import org.junit.Test;
import java.io.Serializable;
/**
* @author hui
* @descption
* @date 2022/6/16 7:38
*/
public class SerializerUtilTest {
@Test
public void serialize() {
Customer customer = new Customer("张三", 10, "zhangsan", "123456");
byte[] bytes = SerializerUtil.serialize(customer);
Customer.num = 20;
SerializerUtil.deserialize(bytes, Customer.class);
}
}
class Customer implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
private String loginId;
private transient String password;
public static int num = 5;
public Customer(String name, int age, String loginId, String password) {
this.name = name;
this.age = age;
this.loginId = loginId;
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getLoginId() {
return loginId;
}
public void setLoginId(String loginId) {
this.loginId = loginId;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "Customer{" +
"name='" + name + '\'' +
", age=" + age +
", loginId='" + loginId + '\'' +
", password='" + password + '\'' +
'}';
}
}