国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

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

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

瀏覽:159日期: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默認的序列化規則,對象內的所有成員都要序列化,也就是說,這些Class都必須實現Serializable。

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

回答2:

如果 address 成員需要進行序列化的話,則Address類也需要實現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}

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

再說說為什么Address一定要實現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
相關文章:
主站蜘蛛池模板: 欧美成人二区 | 19+韩国主播青草vip视频 | 免费特黄 | 精品亚洲视频在线观看 | 亚洲国产欧洲综合997久久 | 欧美特黄一级aa毛片 | 国产精品午夜波多野结衣性色 | 三级网址在线 | 手机看片1024精品国产 | 五月激情丁香婷婷综合第九 | 国产欧美精品一区二区三区 | 中文字幕在线精品 | 久久综合中文字幕一区二区三区 | 成年片美女福利视频在线 | 国产亚洲福利一区二区免费看 | 欧美日韩精品一区二区三区高清视频 | 综合欧美视频一区二区三区 | 国产女乱淫真高清免费视频 | 国产成人精品亚洲日本语音 | 男人透女人超爽视频免费 | 亚洲成人欧美 | 欧美成人3d动漫专区 | 国产午夜a理论毛片在线影院 | 亚洲视频网站在线观看 | 男人的天堂欧美精品色偷偷 | 长腿美女被啪的欲仙欲死视频 | 国产精品亚洲成在人线 | 亚洲成a人片在线网站 | 欧美高清一级啪啪毛片 | 久久er热在这里只有精品85 | 我看毛片 | 亚洲国产精品第一区二区 | 精品欧美一区二区精品久久 | 日本高清福利视频在线观看 | 日本韩国一区二区三区 | 久久久这里只有精品免费 | 黄男人和女人色一级 | 久草中文网 | 欧美一级毛片图 | 欧美毛片一级的免费的 | 精品视频在线视频 |