zoukankan      html  css  js  c++  java
  • 记一次RMI的调用-序列化属性全部丢失

    这两天在测试一个Spring RMI接口的时候,出现了个奇怪的问题。Server端返回的数据,到了客户端出现了属性丢失的情况。
    类继承体系

    。客户端里面定义在ClassA中的属性全部为null。

    分析问题:

    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'}
    

    解读

    序列化的使用场景:

    1. 当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
    2. 当你想用套接字在网络上传送对象的时候;
    3. 当你想通过RMI传输对象的时候;

    小结:

    序列化的范围是 Serializable 接口的子类,不包含该子类的不包含。

  • 相关阅读:
    [ZJOI 2012]数列
    [JSOI 2011]柠檬
    sonar错误及修改方案
    mysql 查询该字段不包含中文
    service 事务
    mysql 不等于和null
    java文件编译为class文件
    主,副时间排序
    MySQL 按首字母排序
    excle导入
  • 原文地址:https://www.cnblogs.com/jason0529/p/9628585.html
Copyright © 2011-2022 走看看