Marqun_king 2022-08-16 10:54 采纳率: 75%
浏览 20
已结题

Java中多次序列化同一个对象出现的问题

问题遇到的现象

在学习Java对象序列化的时候,看到了这么一个知识点:
在使用ObjectOutputStream的writeObject()方法多次对一个对象序列化的时候,只会在第一次序列化的时候写入序列化信息,在以后对该对象进行序列化的时候,如果发现该对象已经被序列化了之后,只会输出一个序列化的编号,用来保证序列化的对象是同一个对象.但是下面代码:

public class Demo2 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        try (
                ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("a.txt"));
                ObjectInputStream ois = new ObjectInputStream(new FileInputStream("a.txt"))
        ) {
            Person ps = new Person("孙悟空", 500);
            // 序列化ps
            oos.writeObject(ps);
            // 修改ps的属性
            ps.name = "猪八戒";
            // 再次序列化
            oos.writeObject(ps);
            // 反序列化
            Person person1 = (Person) ois.readObject();
            Person person2 = (Person) ois.readObject();
            System.out.println(person1 == person2);
            System.out.println(person1.name + "=======" + person2.name);

        }
    }
}

class Person implements Serializable {
    String name;
    Integer age;

    public Person(String name, Integer age) {
        this.age = age;
        this.name = name;
    }
}
运行结果
true
孙悟空=======孙悟空

结果显示这两个反序列化的对象是同一个对象,并且name的属性值是第一次序列化的时候的属性值,我对对象的修改并没有生效,这也证实了第二次序列化的时候只是输出了一个编号,这是序列化的好处和弊端,但是这样的话我序列化一个对象之后就不能再对其做出更改了,如何避免上述代码出现的问题呢?

  • 写回答

1条回答 默认 最新

  • weixin_48484941 2022-08-16 14:34
    关注

    重新new一个Person。Person ps1 = new Person("猪八戒", 500);

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月23日
  • 修改了问题 8月16日
  • 创建了问题 8月16日

悬赏问题

  • ¥30 设计一个图形用户界面来控制你机械臂的运动
  • ¥30 3d打印机无法识别到SD卡,如何解决?(相关搜索:格式化)
  • ¥15 RPG游戏架构设计和开发方法
  • ¥30 为什么会失败呢,该如何调整
  • ¥15 前端返回pdf时不显示内容
  • ¥50 如何在不能联网影子模式下的电脑解决usb锁
  • ¥20 服务器redhat5.8网络问题
  • ¥15 如何利用c++ MFC绘制复杂网络多层图
  • ¥20 要做柴油机燃烧室优化 需要保持压缩比不变 请问怎么用AVL fire ESE软件里面的 compensation volume 来使用补偿体积来保持压缩比不变
  • ¥15 python螺旋图像