記一次RMI的調用數據失誤

這兩天在測試一個Spring RMI接口的時候,出現了個奇怪的問題。Server端返回的數據,到了客戶端出現了屬性丟失的狀況。
類繼承體系 java

。客戶端裏面定義在ClassA中的屬性所有爲null。shell

分析問題:

RMI過程當中的數據有一個序列化和反序列化的過程,分析多是因爲序列化和反序列化的緣由致使數據丟失。數據庫

測試:

public static void main(String[] args) throws IOException, ClassNotFoundException {
        ClassB b = new ClassB();
        b.setName("abc");
        b.setId(1L);
        logger.info(b.toString());
        FileOutputStream fs = new FileOutputStream("foo.ser");
        ObjectOutputStream os = new ObjectOutputStream(fs);
        os.writeObject(b);

        ObjectInputStream is = new ObjectInputStream(new FileInputStream("foo.ser"));
        ClassB b2 = (ClassB) is.readObject();
        logger.info(b2.toString());
    }

反序列化的數據丟失了父類ClassA中的屬性。網絡

解決

ClassA也實現 Serializable 接口。更新後的類圖:測試

16:24:37.769 [main] INFO  ser.Main - ClassB{id='1'name='abc'}
16:24:37.879 [main] INFO  ser.Main - ClassB{id='1'name='abc'}

解讀

序列化的使用場景:3d

  1. 當你想把的內存中的對象狀態保存到一個文件中或者數據庫中時候;
  2. 當你想用套接字在網絡上傳送對象的時候;
  3. 當你想經過RMI傳輸對象的時候;

小結:

序列化的範圍是 Serializable 接口的子類,不包含該子類的不包含。code

相關文章
相關標籤/搜索