transient 修饰符
在实现Serilizable接口时,将不需要序列化的属性前添加关键字transient,那么序列化对象的时候,这个属性就不会序列化到指定的目的地中。
那么我们接下来直接手撕代码:
package com.jdx.example;
import java.io.Serializable;
public class MortyCipher implements Serializable {
/**
* 唯一标识
*/
private static final long serialVersionUID = 1L;
/**
* 姓名
*/
private String name;
public MortyCipher(String name, String password) {
this.name = name;
this.password = password;
}
/**
* 密码
*/
private transient String password;
/**
* 性别
*/
private static transient String sex = "boy";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public static String getSex() {
return sex;
}
public void setSex(String sex) {
MortyCipher.sex = sex;
}
}
之后 在写一个测试类
@Test
public void MortyCipher() throws FileNotFoundException, IOException, ClassNotFoundException {
//创建一个 MortyCipher 对象
MortyCipher cipher = new MortyCipher("Morty", "123456");
//输出
System.out.println("name=" + cipher.getName());
System.out.println("passWord=" + cipher.getPassword());
System.out.println("sex=" + cipher.getSex());
//指定输出文件定制 (从不可见到可见)
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("D:\\Desktop\\morty.txt"));
//读写文件
out.writeObject(cipher);
//清空缓存区
out.flush();
//关闭输出流
out.close();
//新建输入流 (从可见到不可见)
ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:\\Desktop\\morty.txt"));
//将MortyCipher对象放到输出流
MortyCipher mortyCipher = (MortyCipher) in.readObject();
//关闭输出流
in.close();
//输出
System.out.println("After name=" + mortyCipher.getName() + " password=" + mortyCipher.getPassword() + "sex=" + MortyCipher.getSex());
}
以下是输出结果:
从代码测试结果来看在加了 transient
关键字之后 sex 并没有进行序列化.这一点可以从序列化之后的产物中看出:
sr com.jdx.example.MortyCipher
L namet Ljava/lang/String;xpt Morty
这里出现乱码的原因是因为序列化的文件是字节码,不能用记事本打开,故此会造成乱码;当然也可以用一些相关手段解决,在此我就不过多赘述了.