1.什么是Java序列化java
1.序列化 理解为"打碎"便可安全
2.在书本上序列化的意思是将Java对象转为二进制服务器
3.java平台容许咱们在内存中建立对象,当JVM运行时对象才能存在,若是JVM中止,对象消失 ide
若是咱们须要Java对象在JVM中止后,可以保存对象,而且在未来能读取保存的对象,这是须要序列化this
使用Java对象序列化时,会将对象保存为一组字节,对象序列化保存的时对象状态,就是对象的成员变量加密
对象序列化不会关注类中的静态变量spa
建立一个User类,用于序列化及反序列化code
public class User implements Serializable { private static final long serialVersionUID = -6849794470754667710L; private String name; private Integer age; private transient String gender; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + ", gender='" + gender + '\'' + '}'; } }
序列化和反序列化对象
public class Client { @Test public void serializable() throws Exception { User user = new User(); user.setName("hollis"); user.setAge(23); user.setGender("man"); System.out.println(user); //Write Obj to File ObjectOutputStream oos = null; oos = new ObjectOutputStream(new FileOutputStream("temp")); oos.writeObject(user); oos.close(); } @Test public void unSerializable() throws Exception { ObjectInputStream ois= new ObjectInputStream(new FileInputStream(new File("temp"))); User newUser = (User) ois.readObject(); System.out.println(newUser); ois.close(); } }
一、在Java中,只要一个类实现了java.io.Serializable
接口,那么它就能够被序列化。接口
二、经过ObjectOutputStream
和ObjectInputStream
对对象进行序列化及反序列化
三、虚拟机是否容许反序列化,不只取决于类路径和功能代码是否一致,一个很是重要的一点是两个类的序列化 ID 是否一致(就是 private static final long serialVersionUID
)
四、序列化并不保存静态变量。
五、要想将父类对象也序列化,就须要让父类也实现Serializable
接口。
六、Transient 关键字的做用是控制变量的序列化,在变量声明前加上该关键字,能够阻止该变量被序列化到文件中,在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null。
七、服务器端给客户端发送序列化对象数据,对象中有一些数据是敏感的,好比密码字符串等,但愿对该密码字段在序列化时,进行加密,而客户端若是拥有解密的密钥,只有在客户端进行反序列化时,才能够对密码进行读取,这样能够必定程度保证序列化对象的数据安全。