1. 程式人生 > >java序列化(transient和static修飾的變數的序列化實現)

java序列化(transient和static修飾的變數的序列化實現)

序列化 (程式碼摘抄自Java程式設計思想) 平常序列化知識不做介紹 把書裡的有意思東西摘抄下來 用transient修飾是變數是否可以序列化? 靜態變數是否可以初始化? 1.用 Externalizable 介面實現序列化(在重寫的writeExternal和readExternal中實現序列化, 忽視成員變數是否用transient修飾 2.用Serializable實現序列化( privatevoid writeObject(ObjectOutputStream stream)   throws IOException ;   private void readObject(ObjectInputStream stream)   throws IOException, ClassNotFoundException ;
這些方法必須具有準確的特徵簽名 修飾符必須為private 。(private修飾的方法如何呼叫的可以自行思考) 也可以忽視成員變數是否用transient修飾 3.序列化靜態變數可以在所在類實現publicstaticvoid   serializeStaticState方法和deserializeStaticState方法 並且測試main函式裡呼叫 從而實現靜態變數初始化 程式碼如下 1.用 Externalizable 介面實現序列化
publicclassBlip3implementsExternalizable{privateint i;private
transientString s;// No initialization
publicBlip3(){System.out.println("Blip3 Constructor");// s, i not initialized}publicBlip3(String x,int a){System.out.println("Blip3(String x, int a)"); s = x; i = a;// s & i initialized only in non-default constructor.}publicString toString(){return s + i;}public
void writeExternal(ObjectOutput out)
throwsIOException{System.out.println("Blip3.writeExternal");// You must do this: out.writeObject(s); out.writeInt(i);}publicvoid readExternal(ObjectInput in)throwsIOException,ClassNotFoundException{System.out.println("Blip3.readExternal");// You must do this: s =(String)in.readObject(); i = in.readInt();}publicstaticvoid main(String[] args)throwsIOException,ClassNotFoundException{System.out.println("Constructing objects:");Blip3 b3 =newBlip3("A String ",47);// Blip3 b3 = new Blip3();System.out.println(b3);ObjectOutputStream o =newObjectOutputStream(newFileOutputStream("Blip3.out"));System.out.println("Saving object:"); o.writeObject(b3); o.close();// Now get it back:ObjectInputStream in =newObjectInputStream(newFileInputStream("Blip3.out"));System.out.println("Recovering b3:"); b3 =(Blip3)in.readObject();System.out.println(b3);}}/* Output:Constructing objects:Blip3(String x, int a)A String 47Saving object:Blip3.writeExternalRecovering b3:Blip3 ConstructorBlip3.readExternalA String 47*///:~
2.用Serializable實現序列化
publicclassSerialCtlimplementsSerializable{privateString a;privatetransientString b;publicSerialCtl(String aa,String bb){    a ="Not Transient: "+ aa;    b ="Transient: "+ bb;}publicString toString(){return a +"\n"+ b;}privatevoid writeObject(ObjectOutputStream stream)//  public void writeObject(ObjectOutputStream stream)throwsIOException{    stream.defaultWriteObject();    stream.writeObject(b);}privatevoid readObject(ObjectInputStream stream)//  public void readObject(ObjectInputStream stream)throwsIOException,ClassNotFoundException{    stream.defaultReadObject();    b =(String)stream.readObject();}publicstaticvoid main(String[] args)throwsIOException,ClassNotFoundException{SerialCtl sc =newSerialCtl("Test1","Test2");System.out.println("Before:\n"+ sc);ByteArrayOutputStream buf=newByteArrayOutputStream();ObjectOutputStream o =newObjectOutputStream(buf);    o.writeObject(sc);// Now get it back:ObjectInputStream in =newObjectInputStream(newByteArrayInputStream(buf.toByteArray()));SerialCtl sc2 =(SerialCtl)in.readObject();System.out.println("After:\n"+ sc2);}}/* Output:Before:Not Transient: Test1Transient: Test2After:Not Transient: Test1Transient: Test2*///:~
3.1序列化靜態變數(沒實現靜態變數序列化)
3.1_1)序列化
abstractclassShapeimplementsSerializable{publicstaticfinalint RED =1, BLUE =2, GREEN =3;privateint xPos, yPos, dimension;privatestaticRandom rand =newRandom(