[Java] java 控制序列化 有选择地序列化对象(不是把所有对象的一切内容进行序列化) →→→→→进入此内容的聊天室

来自 , 2019-04-12, 写在 Java, 查看 110 次.
URL http://www.code666.cn/view/00ac8ed3
  1. import java.io.Externalizable;
  2. import java.io.FileInputStream;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.ObjectInput;
  6. import java.io.ObjectInputStream;
  7. import java.io.ObjectOutput;
  8. import java.io.ObjectOutputStream;
  9. import java.util.Date;
  10.  
  11. /**
  12.  * 控制序列化就是有选择的序列化对象,而不是把所有对象的一切内容进行序列化。
  13.  * SerializeObject演示了使用transit关键字可以控制变量不被序列化。
  14.  * 本程序将演示通过实现Externalizable接口控制对象的序列化和反序列化。
  15.  */
  16. public class SerializeControl {
  17.         /**
  18.          * 内部类,用于测试控制对象的序列化和反序列化。
  19.          * 被序列化的对象必须实现Externalizable接口,该接口有2个方法:
  20.      * writeExternal方法、readExternal方法。
  21.      * 当序列化对象的时候,writeExternal方法会自动执行,所有的对象写入操作由该方法控制。
  22.      * 反序列化对象的时候,readExternal方法会自动执行,如果想访问writeExternal写入的内容,
  23.      * 也只能在该方法里编写恢复对象的代码。
  24.          */
  25.         static class MyClassControl implements Externalizable{
  26.              int serialClassInt;
  27.              int a=3, b=4;
  28.              public MyClassControl(){
  29.                  System.out.println("MyClass constructor!");
  30.                  this.serialClassInt = 9;
  31.              }
  32.              
  33.              public void show(){
  34.                  System.out.println("serialClassInt: " + serialClassInt);
  35.              }
  36.             //当序列化对象的时候,该方法自动被调用
  37.             public void writeExternal(ObjectOutput out) throws IOException{
  38.                 System.out.println("run writeExternal");
  39.                 //可以在序列化时写非自身的变量,
  40.                 Date d = new Date();
  41.                 out.writeObject(d);
  42.                 //只序列化serialClassInt变量,a、b两个变量不被序列化
  43.                 out.writeInt(this.serialClassInt);        
  44.             }
  45.             // 当反序列化对象的时候, 该方法自动被调用
  46.                 public void readExternal(ObjectInput in) throws IOException,
  47.                                 ClassNotFoundException {
  48.                         System.out.println("run readExternal");
  49.                         Date d = (Date) in.readObject();
  50.                         System.out.println(d);
  51.                         this.serialClassInt = in.readInt();
  52.                 }
  53.         }
  54.         /**
  55.          * 序列化对象
  56.          */
  57.     public static void serializable(String fileName) throws Exception{
  58.         ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(fileName));
  59.         MyClassControl my1 = new MyClassControl();
  60.         out.writeObject(my1);
  61.         out.close();        
  62.     }
  63.     /**
  64.      * 反序列化
  65.      */
  66.     public static void deserializable(String fileName)throws Exception{
  67.         ObjectInputStream in = new ObjectInputStream(new FileInputStream(fileName));
  68.         MyClassControl my2 = (MyClassControl)in.readObject();
  69.         my2.show();
  70.         in.close();
  71.     }
  72.  
  73.         public static void main(String[] args) throws Exception{
  74.                 String fileName = "c:/temp/MyClassControl.ser";
  75.                 SerializeControl.serializable(fileName);
  76.                 SerializeControl.deserializable(fileName);
  77.         }
  78. }
  79.  

回复 "java 控制序列化 有选择地序列化对象(不是把所有对象的一切内容进行序列化)"

这儿你可以回复上面这条便签

captcha