又一個難題!Java 序列化和反序列化為什么要實現(xiàn) Serializable 接口
閱讀本文大概需要 6 分鐘。
來自:blog.csdn.net/litianxiang_kaola
序列化和反序列化是什么? 實現(xiàn)序列化和反序列化為什么要實現(xiàn) Serializable 接口? 實現(xiàn) Serializable 接口就算了, 為什么還要顯示指定 serialVersionUID 的值? 我要為 serialVersionUID 指定個什么值?
序列化和反序列化
序列化:把對象轉(zhuǎn)換為字節(jié)序列的過程稱為對象的序列化. 反序列化:把字節(jié)序列恢復(fù)為對象的過程稱為對象的反序列化.
什么時候需要用到序列化和反序列化呢?
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>
實現(xiàn)序列化和反序列化為什么要實現(xiàn) Serializable 接口?
實現(xiàn) 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("序列化前的結(jié)果:?"?+?user);
????????serialize(user);
????????User?dUser?=?deserialize();
????????System.out.println("反序列化后的結(jié)果:?"+?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?+?'\\''?+
????????????????'}';
????}
}
序列化前的結(jié)果: 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;
序列化前的結(jié)果: User{name='tyshawn', age=18} 反序列化后的結(jié)果: 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("序列化前的結(jié)果:?"?+?user);
????????serialize(user);
????????User?dUser?=?deserialize();
????????System.out.println("反序列化后的結(jié)果:?"+?dUser);
????}
}
序列化前的結(jié)果: User{name='tyshawn', age=18, sex='man', signature='你眼中的世界就是你自己的樣子'} 反序列化后的結(jié)果: User{name='tyshawn', age=18, sex='null', signature='我的眼里只有你'}
static 屬性為什么不會被序列化?
推薦閱讀:
微信掃描二維碼,關(guān)注我的公眾號
朕已閱?

