JavaBean的冷藏与解冻

JavaBean的冷藏与解冻

即javaBean的串行化(Serializable)与并行化(DeSerializable)

 

串行处理 功能真正强大之处在于一个Java程序不需要直接处理存储在硬盘上面的原始数据,就可以

很容易地将一个java对象和一个二进制流之间相互转换.

将一个对象串行化只需要实现两个接口中的一个即可:要么实现java.io.Serializable接口,或

Externalizable接口.Serializable接口是一个标识接口,它没有任何方法,Externalizable接口是Serializable的

子类,有两个方法要实现.一般采用Serializable接口.

 

import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.TextField;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/**
 * 说明:
 * 这是一个将TextField 的对象进行串行化和并行化处理的例子
 * 串行化时将执行这个(即打开,将下面的注释)
 * TextField textField = makeTextField(text, size);
 *	serialzeTextField(textField, "myTextField.ser");
 *
 *并行化时执行下面这个(即打开,将上面的注释)
 * TextField textField = dserialzeTextField("myTextField.ser");
 */
public class PickleMaker extends Frame {

	private static final long serialVersionUID = -7908334509971379077L;

	public PickleMaker(String text, int size) {
		super("Pickle Maker");
		addWindowListener(new WinLis());
		setLayout(new FlowLayout());

		// 冷藏
		TextField textField = makeTextField(text, size);
		serialzeTextField(textField, "myTextField.ser");

		// 解冻
		//TextField textField = deserialzeTextField("myTextField.ser");

		add(textField);
	}

	// 将textField对象串行化
	private void serialzeTextField(TextField textField, String fileName) {
		try {
			FileOutputStream outStream = new FileOutputStream(fileName);
			ObjectOutputStream oos = new ObjectOutputStream(outStream);
			oos.writeObject(textField);
			oos.flush();
			oos.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
	//并行化处理 即将保存在硬盘的数据 转为实例对象
	private TextField deserialzeTextField(String fileName) {
		TextField tf = null;
		try {
			FileInputStream fis = new FileInputStream(fileName);
			ObjectInputStream ois = new ObjectInputStream(fis);
			tf = (TextField) ois.readObject();
		} catch (Exception e) {
			e.printStackTrace();
		}

		return tf;
	}

	// 创建TextField对象
	private TextField makeTextField(String text, int size) {
		TextField tf = new TextField(text, size);
		return tf;
	}

	public static void main(String[] args) {
		Frame f = new PickleMaker("No Matter where you go.", 25);
		f.setBounds(0, 0, 300, 200);
		f.setVisible(true);
	}
}
//事件处理
class WinLis extends WindowAdapter {
	@Override
	public void windowClosing(WindowEvent e) {
		Frame f = (Frame) e.getSource();
		f.setVisible(false);
		f.dispose();
		System.exit(0);

		super.windowClosing(e);
	}
}

 

 

 

 

而在JSP中也有应用

 

 JSP中使用串行化
	 * 如:
	 * 		
	 * 若中beanName所对应的值就是冷藏的文件名称,

 jsp引擎实际上是调用Beans.instantiate()方法进行并行化的.

 

 

/**
 * 不应当串行化的条件:
 *1.一个类与本地代码(native code)有紧密的关系.如java.util.zip.Deflater则是一个例子
 *2.对象的内部状态依赖于java虚拟机或运行环境,从而在每一次运行时这个状态都有可能不同.
 *	如:java.lang.Thread, java.io.InputStream, java.io.FileDescriptor
 *		java.awt.PrintJob等 
 *3.串行化可能带来潜在的安全隐患.如:java.lang.SecurityManager以及java.security.MesssageDigest等
 *4.一个类仅仅是一些静态方法的存放地,并没有任何的内部状态.如java.beans.Bean和java.lang.Math等
 */

 

你可能感兴趣的:(设计模式)