为啥我用可序列化保存后两个对象不相等

Posted

技术标签:

【中文标题】为啥我用可序列化保存后两个对象不相等【英文标题】:Why two object are not equals after i save with serializable为什么我用可序列化保存后两个对象不相等 【发布时间】:2020-05-30 07:29:30 【问题描述】:
public class ProveSerialization 
    public static void main(String[] args) throws Exception
    
        Save obj = new Save();
        obj.a = 4;

        File f = new File("File.txt");
        FileOutputStream fos = new FileOutputStream(f);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(obj);

        FileInputStream fis = new FileInputStream(f);
        ObjectInputStream ois = new ObjectInputStream(fis);
        Save obj1 = (Save) ois.readObject();

        System.out.println(obj1.a);
        System.out.println(obj);
        System.out.println(obj1);
        System.out.println(obj.equals(obj1));
        System.out.println(obj == obj1);

输出:

4
Save@14ae5a5
Save@6d03e736
false
false

【问题讨论】:

你能发布一个完整的程序吗? mySaveObj.equals(anotherSaveObj) 的作用很大程度上取决于Save 中如何(或是否)定义它 【参考方案1】:

检查Object类中equals的实现;它比较两个对象的identity,只有当这两个对象在内存中占据相同的空间时才会成立。但是,通过序列化您的对象,您可以有效地创建一个新对象(这很好,因为您甚至可能打算在两个 VM 之间交换您的序列化对象。因此,序列化对象永远不会相同 和以前一样。

但是,如果您打算为您的 Save 对象放宽 equals 的定义,请记住您可以覆盖该方法。不过我猜,那是OT吧?

【讨论】:

我相信equals 的问题(可能没有定义)正是感知行为的原因。

以上是关于为啥我用可序列化保存后两个对象不相等的主要内容,如果未能解决你的问题,请参考以下文章

为啥要序列化

为啥要实现Serializable

android activity之间传递对象 对象为啥要序列化

javabean为啥要实现序列化

intent传对象为啥要序列化

在Java中测试两个JSON对象的相等性忽略子顺序[关闭]