java序列化(transient和static修飾的變數的序列化實現)
阿新 • • 發佈:2019-02-02
序列化
(程式碼摘抄自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 介面實現序列化
3.1_1)序列化
2.用Serializable實現序列化publicclassBlip3implementsExternalizable{
privateint i;
private
transientString s;// No initializationpublicBlip3(){
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 47
Saving object:
Blip3.writeExternal
Recovering b3:
Blip3 Constructor
Blip3.readExternal
A String 47
*///:~
3.1序列化靜態變數(沒實現靜態變數序列化)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: Test1
Transient: Test2
After:
Not Transient: Test1
Transient: Test2
*///:~
3.1_1)序列化
abstractclassShapeimplementsSerializable{
publicstaticfinalint RED =1, BLUE =2, GREEN =3;
privateint xPos, yPos, dimension;
privatestaticRandom rand =newRandom(