为什么序列化对象与原始对象不同?

时间:2017-03-28 06:31:21

标签: java serialization deserialization

我尝试创建一个程序来比较2个对象。如果我创建同一对象的2个实例,则2个对象是不同的,因为即使它们具有相同的“锡”,它们也是2个单独的对象。

但是,就我而言,我创建了一个对象,对其进行序列化,将其反序列化为第二个实例,并将原始对象与副本进行比较。

为什么他们不一样?我甚至不使用“new”来创建第二个实例。我刚看完序列化对象...... 以下是我使用的两个类:

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class Main {

public static void main(String[] args) {
    File file = new File("something.serial");

    //Creation of the 1st object
    Something obj1 = new Something();

    //Serialization
    ObjectOutputStream oos;
    try {
        oos= new ObjectOutputStream(
                new BufferedOutputStream(
                        new FileOutputStream(file)));
        oos.writeObject(obj1);
        oos.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

    //Second object
    Something obj2=null;

    //Deserialization
    ObjectInputStream ois;
    try {
        BufferedInputStream bis = new BufferedInputStream(
                new FileInputStream(file));
        ois = new ObjectInputStream(bis);
        obj2=(Something)ois.readObject();
        ois.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

    //Compare
    if (obj1.equals(obj2)) {
        System.out.println("Same");
    } else {
        System.out.println("Different : ");
        System.out.println(obj1.toString()+" - "+obj2.toString());
    }
}
}

和:

import java.io.Serializable;

public class Something implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = 1L;
public int value = 2;

Something () {

}
}

感谢您提供的有助于我理解的所有答案。

1 个答案:

答案 0 :(得分:4)

好吧,当你序列化它时,对象的状态被保存到文件,而不是内存位置。 反序列化时,内部会创建一个具有相同状态的新对象,并且会向您传递对它的引用。

由于您没有覆盖equals()方法,因此只检查内存地址是否相同。

覆盖.equals()方法并检查状态是否相同。