av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術文章
文章詳情頁

java - 為什么Serializable中定義的Class 不能序列化?

瀏覽:135日期:2023-10-20 09:14:14

問題描述

Fields in a Serializable class must themselves be either Serializable or transient even if the class is never explicitly serialized or deserialized. That’s because under load, most J2EE application frameworks flush objects to disk, and an allegedly Serializable object with non-transient, non-serializable data members could cause program crashes, and open the door to attackers.This rule raises an issue on non-Serializable fields, and on collection fields when they are not private (because they could be assigned non-Serializable values externally), and when they are assigned non-Serializable types within the class.Noncompliant Code Example

public class Address { //...}public class Person implements Serializable { private static final long serialVersionUID = 1905122041950251207L; private String name; private Address address; // Noncompliant; Address isn’t serializable}

問題解答

回答1:

一個對象序列化時,按照Java默認的序列化規(guī)則,對象內的所有成員都要序列化,也就是說,這些Class都必須實現(xiàn)Serializable。

所以,你有兩種改法,一是Address實現(xiàn)Serializable接口,二是對Person中的address成員加上transient標記,這樣該成員就不會被序列化進去。

回答2:

如果 address 成員需要進行序列化的話,則Address類也需要實現(xiàn)Serializable接口。如果 address 成員不需要進行序列化的話,可以加上transient關鍵字,則address成員不做序列化操作,值為null。如下:

public class Person implements Serializable { private static final long serialVersionUID = 1905122041950251207L; private String name; private transient Address address; // Noncompliant; Address isn’t serializable}

當然還有其他方式:比如實現(xiàn)Externalizable接口,重寫readExternal(ObjectInput in)和writeExternal(ObjectOutput out)方法。還有一個替代實現(xiàn)Externalizable接口方法,還是實現(xiàn)Serializable接口,添加writeObject(ObjectOutputStream obs)和readObject(ObjectInputStream ois)方法。

再說說為什么Address一定要實現(xiàn)Serializable,或者加上transient關鍵字Person才能進行序列化?先看看不做處理,使用 ObjectOutputStream 來持久化對象,拋出的異常

Exception in thread 'main' java.io.NotSerializableException

ObjectOutputStream源碼:

/** * Underlying writeObject/writeUnshared implementation. */ private void writeObject0(Object obj, boolean unshared)throws IOException { //...... // remaining cases if (obj instanceof String) {writeString((String) obj, unshared); } else if (cl.isArray()) {writeArray(obj, desc, unshared); } else if (obj instanceof Enum) {writeEnum((Enum<?>) obj, desc, unshared); } else if (obj instanceof Serializable) {writeOrdinaryObject(obj, desc, unshared); } else {if (extendedDebugInfo) { throw new NotSerializableException(cl.getName() + 'n' + debugInfoStack.toString());} else { throw new NotSerializableException(cl.getName());} }} finally { depth--; bout.setBlockDataMode(oldMode);} }

從此可知, 如果被寫對象類型是String、Array、Enum、Serializable,就可以進行序列化,否則將拋出NotSerializableException。且在序列化對象時,不僅會序列化當前對象本身,還會對該對象引用的其它對象也進行序列化。

標簽: java
相關文章:
主站蜘蛛池模板: 日韩视频 中文字幕 | 精品视频在线观看 | 在线观看精品视频网站 | 欧美一区二区三区在线看 | 视频一二三区 | 日韩欧美三级 | 丁香五月缴情综合网 | 久久一区二区三区四区 | 九九免费视频 | 免费观看一级特黄欧美大片 | 国产传媒在线观看 | 黑色丝袜三级在线播放 | 亚洲一区 | 久久中文网 | 91精品国产一区二区三区 | 欧美激情欧美激情在线五月 | 欧美lesbianxxxxhd视频社区 | 国产1区2区在线观看 | 在线观看国产网站 | 国产精品视频久久 | 三级在线视频 | www.成人久久 | 69性欧美高清影院 | www.v888av.com| 五十女人一级毛片 | 国产精品视频一区二区三区四区国 | 精品国产一二三区 | 香蕉大人久久国产成人av | 免费的av| 国产精品99久久久久久动医院 | 成人免费视频网站 | 一区二区三区免费 | 国产精品女人久久久 | 午夜视频在线免费观看 | 男女羞羞视频在线观看 | 久久久久网站 | 日本精品一区二区三区视频 | 国产福利91精品 | 一级做a | a级性视频 | 久久久精品影院 |