Java序列化
什么是序列化?
对象转换为字节序列的过程称为对象的序列化
什么是反序列化?
把字节序列恢复为对象的过程称为对象的反序列化
测试:
import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = 2375751800978367831L;
private String username;
private transient String password;
public User() {
}
public User(String username, String password) {
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
import java.io.*;
public class Test {
public static void main(String[] args) {
User user = new User();
user.setUsername("张三");
user.setPassword("123456");
ObjectOutputStream objectOutputStream=null;
ObjectInputStream objectInputStream=null;
try {
objectOutputStream=new ObjectOutputStream(new FileOutputStream("D:/test.txt"));
objectOutputStream.writeObject(user);
objectOutputStream.flush();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(objectOutputStream!=null)
objectOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
try {
objectInputStream=new ObjectInputStream(new FileInputStream("D:/test.txt"));
Object o = objectInputStream.readObject();
User user1=(User)o;
System.out.println(user1);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}finally {
try {
if(objectInputStream!=null)
objectInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

transient使用小结:
-
一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。
-
transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量(局部变量)是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。
-
被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。
细节:
若实现的是Externalizable接口,则没有任何东西可以自动序列化,需要在writeExternal方法中进行手工指定所要序列化的变量,这与是否被transient修饰无关。

浙公网安备 33010602011771号