7
public class MySerializable implements Serializable{

    private int x=10;
    private static int y = 15;
    public static void main(String...args){
        AnotherClass a = new AnotherClass();
        AnotherClass b;
        //Serialize
        try {
            FileOutputStream fout = new FileOutputStream("MyFile.ser");
            ObjectOutputStream Oout = new ObjectOutputStream(fout);
            Oout.writeObject(a);
            System.out.println( a.toString());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        //De-serialize
        try {
            FileInputStream fis = new FileInputStream("MyFile.ser");
            ObjectInputStream  Oin = new ObjectInputStream (fis); 
            b = (AnotherClass) Oin.readObject();
            System.out.println( b.toString());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }catch (ClassNotFoundException e){
            e.printStackTrace();
        }

    }
}

class AnotherClass  implements Serializable{  

    transient int x = 8;  
    static int y = 9;  

    @Override  
    public String toString() {  
        return "x : " + x + ", y :" + y;  
    }  
}

静的変数がどのようにシリアル化されるか教えてください??

4

5 に答える 5

11

どうやら、静的変数はシリアル化できます (ただし、シリアル化はクラスのインスタンスの状態を保存するプロセスであり、静的変数はすべてのインスタンスに共通であるため)。インスタンスの状態については何も言わないので、まったく意味がありません。

静的変数のシリアル化が許可されているとします。次に、インスタンスを逆シリアル化すると、その変数の古いコピーが取得されますが、それ以降に変更された可能性があります。静的変数はクラスのすべてのインスタンスで共有されるため、任意のインスタンスからの変数の変更は、このインスタンスに反映される必要があります。

したがって、これらの条件下での変数は、静的変数としての契約に違反する可能性があるため、シリアル化しないでください。

連載: -

  • 静的変数をシリアル化しないでください..

デシリアライゼーション: -

  • インスタンスは、クラスとともにロードされた静的フィールドを取得します。したがって、その変数に対して行われた可能性のある変更は、このインスタンスにも責任があります。
于 2012-10-08T05:56:12.513 に答える
2

MySerializable クラスの現在の出力は以下のとおりです。

x : 8, y :9
x : 0, y :9

この場合、静的変数はtoString() メソッドを呼び出した後に出力されます。この時点までに、クラス レベルの変数から値が読み取られます。

これを試して:

//Serializeブロックの後に MySerializable Class にこのコード行を追加します

AnotherClass.y = 5;

出力は次のとおりです。

x : 8, y :9
x : 0, y :5

これは、静的変数がファイルに保存されていないことを意味し、 toString() メソッドによって動的に読み取られます。

于 2012-10-08T07:37:40.360 に答える
0

- シリアル化中にオブジェクトSerializationの状態を保存するために使用されるため、逆シリアル化中に保存された状態を使用して、ヒープ上の同一のオブジェクトを復活させることができます。

- はい static、変数は可能ですが、意味serializedがありません....。

于 2012-10-08T05:59:34.133 に答える
0

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

class TestJava implements Serializable{
    public static int k = 10;
    public int j=5;
public static void main(String[] args) {
    
    TestJava tj1= new TestJava();
    TestJava tj2;
    
    
        try{ //serialization
            FileOutputStream fos = new FileOutputStream("myclass.ser");
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(tj1);
            oos.close();
            fos.close();
            System.out.println("object serielized 1..."+tj1.j);
            System.out.println("object serielized 2..."+tj1.k);
            System.out.println("object serielized 3..."+k);
            k=++k; // 'k' value incrementd after serialization
          } catch(FileNotFoundException fnfe){
             fnfe.printStackTrace();
          } catch(IOException ioex){
             ioex.printStackTrace();
          }
    
      
          try{ //deserialization
              FileInputStream fis = new FileInputStream("myclass.ser");
              ObjectInputStream ois = new ObjectInputStream(fis);
              tj2 = (TestJava) ois.readObject();
              ois.close();
              fis.close();
              System.out.println("object DEEEEserielized 1..."+tj2.j);
              System.out.println("object DEEEEserielized 2..."+tj2.k); 
              System.out.println("object DEEEEserielized 3..."+k); 
            // in deserialization 'k' value is shown as incremented. 
            // That means Static varialbe 'K' is not serialized.
            // if 'K' value is serialized then, it has to show old value before incrementd the 'K' value.
            } catch(FileNotFoundException fnfe){
              fnfe.printStackTrace();
            } catch(IOException ioex){
              ioex.printStackTrace();
            } catch(ClassNotFoundException CNFE){
              CNFE.printStackTrace();                   
           }
      }
}

/* Output of the above program
 
object serielized 1...5
object serielized 2...10
object serielized 3...10
object DEEEEserielized 1...5
object DEEEEserielized 2...11
object DEEEEserielized 3...11


*/

于 2015-02-01T17:19:16.743 に答える