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中使用串行化 * 如:<jsp:useBean id="UserBean" type="com.bean.UserBean" beanName="serUserBean"/> * <jsp:getProperty name="UserBean" property="userName"/> * 若中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等
*/