又一个难题!Java 序列化和反序列化为什么要实现 Serializable 接口
阅读本文大概需要 6 分钟。
来自:blog.csdn.net/litianxiang_kaola
序列化和反序列化是什么? 实现序列化和反序列化为什么要实现 Serializable 接口? 实现 Serializable 接口就算了, 为什么还要显示指定 serialVersionUID 的值? 我要为 serialVersionUID 指定个什么值?
序列化和反序列化
序列化:把对象转换为字节序列的过程称为对象的序列化. 反序列化:把字节序列恢复为对象的过程称为对象的反序列化.
什么时候需要用到序列化和反序列化呢?
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/\*\* The value is used for character storage. \*/
private final char value\[\];
/\*\* Cache the hash code for the string \*/
private int hash; // Default to 0
/\*\* use serialVersionUID from JDK 1.0.2 for interoperability \*/
private static final long serialVersionUID = -6849794470754667710L;
......
}
<insert id="insertUser" parameterType="org.tyshawn.bean.User">
INSERT INTO t\_user(name, age) VALUES (#{name}, #{age})
insert>
实现序列化和反序列化为什么要实现 Serializable 接口?
实现 Serializable 接口就算了, 为什么还要显示指定 serialVersionUID 的值?
public class User implements Serializable {
private String name;
private Integer age;
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;
}
@Override
public String toString() {
return "User{" +
" + name + '\\'' +
", age=" + age +
'}';
}
}
public class SerializableTest {
private static void serialize(User user) throws Exception {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("D:\\\\111.txt")));
oos.writeObject(user);
oos.close();
}
private static User deserialize() throws Exception{
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("D:\\\\111.txt")));
return (User) ois.readObject();
}
public static void main(String\[\] args) throws Exception {
User user = new User();
user.setName("tyshawn");
user.setAge(18);
System.out.println("序列化前的结果: " + user);
serialize(user);
User dUser = deserialize();
System.out.println("反序列化后的结果: "+ dUser);
}
}
public class User implements Serializable {
private String name;
private Integer age;
private String sex;
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 getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "User{" +
" + name + '\\'' +
", age=" + age +
", sex='" + sex + '\\'' +
'}';
}
}
序列化前的结果: User{name='tyshawn', age=18} Exception in thread "main" java.io.InvalidClassException: org.tyshawn.SerializeAndDeserialize.User; local class incompatible: stream classdesc serialVersionUID = 1035612825366363028, local class serialVersionUID = -1830850955895931978
private static final long serialVersionUID = 1L;
序列化前的结果: User{name='tyshawn', age=18} 反序列化后的结果: User{name='tyshawn', age=18, sex='null'}
Java 序列化的其他特性
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private Integer age;
private transient String sex;
private static String signature = "你眼中的世界就是你自己的样子";
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 getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public static String getSignature() {
return signature;
}
public static void setSignature(String signature) {
User.signature = signature;
}
@Override
public String toString() {
return "User{" +
" + name + '\\'' +
", age=" + age +
", sex='" + sex +'\\'' +
", signature='" + signature + '\\'' +
'}';
}
}
public class SerializableTest {
private static void serialize(User user) throws Exception {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("D:\\\\111.txt")));
oos.writeObject(user);
oos.close();
}
private static User deserialize() throws Exception{
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("D:\\\\111.txt")));
return (User) ois.readObject();
}
public static void main(String\[\] args) throws Exception {
User user = new User();
user.setName("tyshawn");
user.setAge(18);
user.setSex("man");
System.out.println("序列化前的结果: " + user);
serialize(user);
User dUser = deserialize();
System.out.println("反序列化后的结果: "+ dUser);
}
}
序列化前的结果: User{name='tyshawn', age=18, sex='man', signature='你眼中的世界就是你自己的样子'} 反序列化后的结果: User{name='tyshawn', age=18, sex='null', signature='我的眼里只有你'}
static 属性为什么不会被序列化?
推荐阅读:
微信扫描二维码,关注我的公众号
朕已阅