2013-08-24 40 views
5

Trong lớp tuần tự hóa java Mp3player mở rộng ElectronicDevice thực hiện Serializable trong mã điện tử siêu hạng này không được triển khai tuần tự. ở đây lớp siêu cũng được sắp xếp theo thứ tự. sự hiểu biết của tôi là siêu lớp cũng được serialized do extends.let tôi biết sự hiểu biết của tôi là chính xác hay không.Tuần tự hóa Java cho Lớp mở rộng

import java.io.*; 
class ElectronicDevice { 
     ElectronicDevice() 
     { 
      System.out.print("ed "); 
     } 
    } 
class Mp3player extends ElectronicDevice implements Serializable { 
     Mp3player() 
     { 
      System.out.print("mp "); 
     } 
} 
class MiniPlayer extends Mp3player { 
    MiniPlayer() 
    { 
     System.out.print("mini "); 
    } 
    public static void main(String[] args) { 
      MiniPlayer m = new MiniPlayer(); 
      try { 
       FileOutputStream fos = new FileOutputStream("dev.txt"); 
      ObjectOutputStream os = new ObjectOutputStream(fos); 
       os.writeObject(m); os.close(); 

       FileInputStream fis = new FileInputStream("dev.txt"); 
       ObjectInputStream is = new ObjectInputStream(fis); 
       MiniPlayer m2 = (MiniPlayer) is.readObject(); 
       is.close(); 
       System.out.println(); 
      } catch (Exception x) { 
       System.out.print("x "); 
      } 
    } 
    } 
+1

Mã cố gắng hiển thị chính xác là gì? Bạn không hiểu điều gì? –

+0

java serialization cơ chế chỉ chăm sóc trường hợp của các lớp thực hiện 'Serializable', vì vậy trong trường hợp của bạn, các trường thừa kế từ' ElectronicDevice' (nếu có) sẽ không được tuần tự hóa/deserialized theo mặc định, xem [this] (http: // stackoverflow. com/a/7663590/594406) trả lời. – Katona

+0

trong mã trên điện tử không được thực hiện giao diện serializable nhưng trong kết quả (sau khi deserialize) "ed" cũng đến trong đầu ra. – rama

Trả lời

2

No.Quá trình tuần tự hóa chỉ các trường của đối tượng có thể tuần tự được ghi ra và khôi phục.

Theo javadocs

Trong deserialization, các lĩnh vực của các tầng lớp phi serializable sẽ được khởi tạo bằng cách sử dụng công cộng hoặc bảo vệ không-arg constructor của lớp.

Trường hợp các trường lớp con có thể tuần tự hóa sẽ được khôi phục từ luồng.

hãy nhìn vào ví dụ này
Đây ElectronicDevice không phải là Serializable, nơi như Mp3playerSerializable .Observe các lĩnh vực hành vi lớp học tôn trọng trong quá trình tuần tự.

import java.io.*; 
class ElectronicDevice { 
    public int i = 0; 
    protected ElectronicDevice() 
    { 
     System.out.println("ed "); 
    } 
} 
class Mp3player extends ElectronicDevice implements Serializable { 
    int j =0; 
    Mp3player() 
    { 
     System.out.println("mp "); 
    } 
} 
class MiniPlayer extends Mp3player { 
    MiniPlayer() 
    { 
     System.out.println("mini "); 
    } 
public static void main(String[] args) { 
     MiniPlayer m = new MiniPlayer(); 
     m.i = 30; 
     m.j = 40; 
     try { 
      System.out.println("i value before serialization: "+m.i);//prints 30 
      System.out.println("i value before serialization: "+m.j);//prints 40 
      FileOutputStream fos = new FileOutputStream("dev.txt"); 
      ObjectOutputStream os = new ObjectOutputStream(fos); 
      os.writeObject(m); os.close(); 

      FileInputStream fis = new FileInputStream("dev.txt"); 
      ObjectInputStream is = new ObjectInputStream(fis); 
      MiniPlayer m2 = (MiniPlayer) is.readObject(); 
      is.close(); 
      System.out.println("i value after serialization: "+m2.i);//prints o 
      System.out.println("j value after serialization: "+m2.j);//prints 40 
      System.out.println(); 
     } catch (Exception x) { 
      x.printStackTrace(); 
      System.out.print("x "); 
     } 
    } 
} 
4

Vì siêu lớp không triển khai Nội dung nối tiếp của siêu lớp sẽ không được đăng. Chỉ nội dung của lớp con mới được đăng. Khi bạn deserialize constructor mặc định của superclass sẽ được thực thi và các trường của superclass được khởi tạo như thể bạn đã gọi constructor mặc định.

Ví dụ sau minh họa điều này.

public class SerializationTest { 

    public static class Base { 
     private String name; 

     public Base() { 
      this.name = "johnDow"; 
     } 

     public String getName() { 
      return name; 
     } 

     public void setName(String name) { 
      this.name = name; 
     } 
    } 

    public static class Sub extends Base implements Serializable { 
     private static final long serialVersionUID = 1L; 
     private String age; 

     public String getAge() { 
      return age; 
     } 

     public void setAge(String age) { 
      this.age = age; 
     } 
    } 

    public static void main(String[] args) throws Exception { 
     ByteArrayOutputStream byteArrayOS = new ByteArrayOutputStream(); 
     ObjectOutputStream out = new ObjectOutputStream(byteArrayOS); 
     Sub s = new Sub(); 
     s.setName("name"); 
     s.setAge("10"); 
     out.writeObject(s); 
     ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(byteArrayOS.toByteArray())); 
     Sub d = (Sub) ois.readObject(); 
     System.out.println(d.getName() + "-" + d.getAge()); 
    } 
} 

gì được in là

johnDow-10 
0

hiểu biết của tôi là siêu lớp cũng được đăng do extends.let tôi biết hiểu biết của tôi là đúng hay không.

Câu trả lời ngắn gọn là NO.

Trong java, mỗi lớp là một phân lớp của Object. Không Object tự thực hiện Serializable?

1

Đây là quy tắc cho serialization lớp cha:

Nếu bạn là một lớp serializable, nhưng cha của bạn là KHÔNG serializable, sau đó bất kỳ biến dụ bạn kế thừa từ đó lớp cha sẽ được đặt lại các giá trị mà họ đã được đưa ra trong quá trình xây dựng ban đầu của đối tượng . Điều này là do các nhà xây dựng lớp không thể thực hiện được S W.

Do đó, nếu bạn thêm một số biến mẫu vào ElectronicDevice, hãy lưu ý rằng trạng thái của siêu lớp sẽ không được tuần tự hóa. (trừ khi siêu lớp triển khai Serializable)

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