JavaBean的冷藏与解冻

来源:互联网 发布:安德罗妮的淘宝店 编辑:程序博客网 时间:2024/04/27 23:31
 

JavaBean的冷藏与解冻

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

 

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

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

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

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

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

 

例子代码
  1. import java.awt.FlowLayout;   
  2. import java.awt.Frame;   
  3. import java.awt.TextField;   
  4. import java.awt.event.WindowAdapter;   
  5. import java.awt.event.WindowEvent;   
  6. import java.io.FileInputStream;   
  7. import java.io.FileOutputStream;   
  8. import java.io.ObjectInputStream;   
  9. import java.io.ObjectOutputStream;   
  10.   
  11. /**   
  12.  * 说明:   
  13.  * 这是一个将TextField 的对象进行串行化和并行化处理的例子   
  14.  * 串行化时将执行这个(即打开,将下面的注释)   
  15.  * TextField textField = makeTextField(text, size);   
  16.  *  serialzeTextField(textField, "myTextField.ser");   
  17.  *   
  18.  *并行化时执行下面这个(即打开,将上面的注释)   
  19.  * TextField textField = dserialzeTextField("myTextField.ser");   
  20.  */   
  21. public class PickleMaker extends Frame {   
  22.   
  23.     private static final long serialVersionUID = -7908334509971379077L;   
  24.   
  25.     public PickleMaker(String text, int size) {   
  26.         super("Pickle Maker");   
  27.         addWindowListener(new WinLis());   
  28.         setLayout(new FlowLayout());   
  29.   
  30.         // 冷藏   
  31.         TextField textField = makeTextField(text, size);   
  32.         serialzeTextField(textField, "myTextField.ser");   
  33.   
  34.         // 解冻   
  35.         //TextField textField = deserialzeTextField("myTextField.ser");   
  36.   
  37.         add(textField);   
  38.     }   
  39.   
  40.     // 将textField对象串行化   
  41.     private void serialzeTextField(TextField textField, String fileName) {   
  42.         try {   
  43.             FileOutputStream outStream = new FileOutputStream(fileName);   
  44.             ObjectOutputStream oos = new ObjectOutputStream(outStream);   
  45.             oos.writeObject(textField);   
  46.             oos.flush();   
  47.             oos.close();   
  48.         } catch (Exception e) {   
  49.             e.printStackTrace();   
  50.         }   
  51.   
  52.     }   
  53.     //并行化处理 即将保存在硬盘的数据 转为实例对象   
  54.     private TextField deserialzeTextField(String fileName) {   
  55.         TextField tf = null;   
  56.         try {   
  57.             FileInputStream fis = new FileInputStream(fileName);   
  58.             ObjectInputStream ois = new ObjectInputStream(fis);   
  59.             tf = (TextField) ois.readObject();   
  60.         } catch (Exception e) {   
  61.             e.printStackTrace();   
  62.         }   
  63.   
  64.         return tf;   
  65.     }   
  66.   
  67.     // 创建TextField对象   
  68.     private TextField makeTextField(String text, int size) {   
  69.         TextField tf = new TextField(text, size);   
  70.         return tf;   
  71.     }   
  72.   
  73.     public static void main(String[] args) {   
  74.         Frame f = new PickleMaker("No Matter where you go."25);   
  75.         f.setBounds(00300200);   
  76.         f.setVisible(true);   
  77.     }   
  78. }   
  79. //事件处理   
  80. class WinLis extends WindowAdapter {   
  81.     @Override   
  82.     public void windowClosing(WindowEvent e) {   
  83.         Frame f = (Frame) e.getSource();   
  84.         f.setVisible(false);   
  85.         f.dispose();   
  86.         System.exit(0);   
  87.   
  88.         super.windowClosing(e);   
  89.     }   
  90. }  

 

 

 

 

而在JSP中也有应用

 

Jsp代码
  1. JSP中使用串行化   
  2.  * 如:<jsp:useBean id="UserBean" type="com.bean.UserBean" beanName="serUserBean"/>   
  3.  *      <jsp:getProperty name="UserBean" property="userName"/>   
  4.  * 若中beanName所对应的值就是冷藏的文件名称,  

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

 

 

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