2012-10-08 19 views
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; 
    } 
} 

Bạn có thể cho tôi biết biến tĩnh được tuần tự hóa như thế nào không ??Biến tĩnh đến được tuần tự như thế nào?

Trả lời

11

Rõ ràng, các biến tĩnh có thể được tuần tự (Nhưng bạn không nên làm điều đó), vì serialization là quá trình tiết kiệm tình trạng của một dụ của một lớp, và các biến tĩnh là chung cho tất cả các trường . Họ không nói bất cứ điều gì về trạng thái của thể hiện, vì vậy, nó sẽ không có ý nghĩa gì cả.

Giả sử bạn được phép tuần tự hóa biến tĩnh. Sau đó, khi bạn deserialize dụ, bạn sẽ nhận được một bản sao cũ của biến đó, mà có thể đã được thay đổi kể từ đó. Vì biến tĩnh được chia sẻ trên tất cả các cá thể của lớp, thay đổi trong biến từ bất kỳ cá thể nào phải được phản ánh trong cá thể này.

Vì vậy, chúng không được tuần tự hóa, vì biến trong các điều kiện này có thể có thể vi phạm hợp đồng của nó dưới dạng biến tĩnh.

serialization: -

  • Không nên serialize các biến tĩnh ..

Deserialization: -

  • Instance sẽ nhận được các lĩnh vực tĩnh đó đã được nạp với lớp .. Vì vậy, bất kỳ thay đổi nào có thể đã được thực hiện cho biến đó sẽ chịu trách nhiệm cho trường hợp này cũng ..
+0

Câu trả lời này là không đúng, biến tĩnh không được lưu trữ và khôi phục bằng cách tuần tự. Các biến tĩnh không thể và không được tuần tự hóa; giá trị của trường tĩnh nằm trong trường lớp toàn bộ thời gian ... nó không bao giờ để lại bộ nhớ nào cả. –

0

-Serialization được sử dụng để lưu các trạng thái của đối tượng trong serialization, vì vậy trong thời gian de-serialization tình trạng lưu có thể được sử dụng để hồi sinh một Đối tượng giống nhau trên heap.

-static biến có thể được serialized nhưng nó không thực hiện bất kỳ cảm giác .....

2

Sản lượng hiện tại của MySerializable Lớp dưới

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

Trong trường hợp này biến tĩnh được in sau khi gọi phương thức toString(), đến thời điểm này nó sẽ đọc giá trị từ cấp độ v có thể xảy ra.

Hãy thử điều này:

Thêm dòng mã này trong MySerializable Lớp sau //Serialize khối

AnotherClass.y = 5; 

đầu ra là:

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

này có nghĩa là biến tĩnh không được lưu trữ trong tệp, nó sẽ đọc theo phương thức toString() theo phương thức động.

0

Biến tĩnh không thể và không được đăng.

Câu hỏi của bạn dường như dựa trên thực tế là bạn đang nhìn thấy cùng một giá trị từ biến tĩnh sau khi tuần tự hóa như trước khi tuần tự hóa, nhưng điều này không phải do giá trị được tuần tự hóa và khôi phục.

Hành vi này là do trình khởi tạo tĩnh cho biến tĩnh đó đặt thành 9 và không bao giờ thay đổi.

Để xác minh rằng các biến tĩnh không được đăng, bạn có thể thực hiện thay đổi đề nghị NPKR của, sửa đổi lĩnh vực tĩnh giữa serialization và deserialization, hoặc bạn có thể làm như sau:

Chạy chương trình này, sau đó nhận xét ra các bit thực hiện tuần tự hóa. Bạn sẽ có phiên bản serialized cũ trên đĩa như là một kết quả.

Sau đó, thay đổi trình khởi tạo tĩnh của trường tĩnh thành y = 5 và chạy lại chương trình: bạn sẽ nhận được 'x: 0 y: 5 as the output, because the value 9` của trường tĩnh không được khôi phục.

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 
 

 

 
*/

Các vấn đề liên quan