日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python反序列化总结_单例模式的反序列化总结

發(fā)布時(shí)間:2024/7/23 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python反序列化总结_单例模式的反序列化总结 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近觀看effective in java ,提到單例模式創(chuàng)建過程中,如果是要保證該對象是可序列化的,需要考慮兩點(diǎn):

1、繼承Serializable接口

2、增加readResolve方法

比較疑惑的是為什么需要增加這個(gè)方法,在以往的使用中需要被序列化的場景也不多,但是自己確實(shí)不明白這個(gè)單例對象在反序列化的時(shí)候會導(dǎo)致增加一個(gè)假冒的對象,從而’單例變的也不在單例‘

深入到代碼細(xì)節(jié)觀察發(fā)現(xiàn):

ObjectInputStream反序列化會利用ObjectStreamClass序列化描述符創(chuàng)建一個(gè)實(shí)例

1、如果實(shí)例不為空

2、且描述符內(nèi)檢測到含有readResolve方法

3、反序列化中沒有異常發(fā)生

滿足以上條件會反射執(zhí)行readResolve獲取實(shí)例對象,并且和先前的對象作比較,不相等,用本次的值覆蓋先前的返回值

不滿足以上條件直接返回實(shí)例對象,完成反序列化

ObjectInputStream源碼如下(標(biāo)紅部分):

private Object readOrdinaryObject(boolean unshared)

throws IOException

{

if (bin.readByte() != TC_OBJECT) {

throw new InternalError();

}

ObjectStreamClass desc = readClassDesc(false);

desc.checkDeserialize();

Object obj;

try {

obj = desc.isInstantiable() ? desc.newInstance() : null;

} catch (Exception ex) {

throw (IOException) new InvalidClassException(

desc.forClass().getName(),

"unable to create instance").initCause(ex);

}

passHandle = handles.assign(unshared ? unsharedMarker : obj);

ClassNotFoundException resolveEx = desc.getResolveException();

if (resolveEx != null) {

handles.markException(passHandle, resolveEx);

}

if (desc.isExternalizable()) {

readExternalData((Externalizable) obj, desc);

} else {

readSerialData(obj, desc);

}

handles.finish(passHandle);

if (obj != null &&

handles.lookupException(passHandle) == null &&

desc.hasReadResolveMethod())

{

Object rep = desc.invokeReadResolve(obj);

if (unshared && rep.getClass().isArray()) {

rep = cloneArray(rep);

}

if (rep != obj) {

handles.setObject(passHandle, obj = rep);

}

}

return obj;

}

-----------------------------------------------------------------------------------------------------------------------

測試程序如下:

package com.tt.st;

import java.io.ObjectStreamException;

import java.io.Serializable;

public class Singleton implements Serializable {

/**

*

*/

private static final long serialVersionUID = 2090309963475550553L;

private static final Singleton instance = new Singleton();

private Singleton() {

System.out.println(System.currentTimeMillis());

}

public static Singleton getInstance() {

return instance;

}

private Object readResolve() ?throws ObjectStreamException {

return instance;

}

}

package com.tt.st;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

public class Main {

private static native ClassLoader latestUserDefinedLoader();

public static void main(String[] args) throws Exception{

// TODO Auto-generated method stub

File file = new File("d:\\doc\\ab.out");

ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(file));

Singleton singleton = Singleton.getInstance();

System.out.println("first: " + singleton);

objectOutputStream.writeObject(singleton);

objectOutputStream.close();

ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(file));

Object object = objectInputStream.readObject();

System.out.println("second: " + object);

objectInputStream.close();

}

}

總結(jié)

以上是生活随笔為你收集整理的python反序列化总结_单例模式的反序列化总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。