2017-03-28 1 views
2

2つのオブジェクトを比較するプログラムを作成しようとしました。同じオブジェクトのインスタンスを2つ作成すると、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()); 
    } 
} 
} 

と::私はちょうどここに は、私が使用して2つのクラスがある...シリアル化されたオブジェクトを読み取る

import java.io.Serializable; 

public class Something implements Serializable { 

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

Something() { 

} 
} 

私が理解するのに役立ちますすべてのあなたの答えをいただき、ありがとうございます。

+3

Somethingクラスにequalsメソッドを実装するにはどうすればよいですか?それをオーバーライドしないと、オブジェクトを正しく明示的に比較することはなく、equalsはfalseを返します。 – xander

+0

あなたの問題は、あなたが** equals()**が本当に何をしているのか分からないことです。したがって、それについて学ぶ。独自のequals()メソッドを実装します。 – GhostCat

答えて

4

まあ、それを直列化すると、オブジェクトの状態はメモリの場所ではなくファイルに保存されます。 逆シリアル化すると、同じ状態の新しいオブジェクトが内部的に作成され、そのオブジェクトへの参照が渡されます。

equals()メソッドをオーバーライドしていないので、メモリアドレスが同じであるかどうかだけチェックします。

.equals()メソッドをオーバーライドして、状態が同じであるかどうかを確認してください。

関連する問題