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);
- }
- }
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中使用串行化 * 如:<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等
- */