【87期】面試官問:Java序列化和反序列化為什么要實(shí)現(xiàn)Serializable接口
閱讀本文大概需要 6 分鐘。
來自:https://blog.csdn.net/litianxiang_kaola
序列化和反序列化是什么?
實(shí)現(xiàn)序列化和反序列化為什么要實(shí)現(xiàn)Serializable接口?
實(shí)現(xiàn)Serializable接口就算了, 為什么還要顯示指定serialVersionUID的值?
我要為serialVersionUID指定個(gè)什么值?
序列化和反序列化
序列化:把對(duì)象轉(zhuǎn)換為字節(jié)序列的過程稱為對(duì)象的序列化.
反序列化:把字節(jié)序列恢復(fù)為對(duì)象的過程稱為對(duì)象的反序列化.
什么時(shí)候需要用到序列化和反序列化呢?
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>
實(shí)現(xiàn)序列化和反序列化為什么要實(shí)現(xiàn)Serializable接口?
實(shí)現(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='"?+?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='"?+?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='"?+?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屬性為什么不會(huì)被序列化?
推薦閱讀:
【85期】談?wù)凧ava面向?qū)ο笤O(shè)計(jì)的六大原則,中高級(jí)面試常問!
【84期】面試中設(shè)計(jì)模式能問些什么?比如說一下三種單例模式實(shí)現(xiàn)
微信掃描二維碼,關(guān)注我的公眾號(hào)
朕已閱?
評(píng)論
圖片
表情

