私は、writeObjectメソッドを使って、POJOクラスのインスタンスを記述しようとしています。私はこのようなコードを書くとき:
private void writeObject(ObjectOutputStream oos) throws IOException,ClassNotFoundException{
oos.defaultWriteObject();
oos.writeObject(this);
}
これは、罰金に動作しますが、私がしようとすると、新しいローカルオブジェクトを作成し、writeObjectメソッドに渡したときにそれがで失敗します
スレッドの例外「メイン」によってjava.lang.StackOverflowError
それは何度も何度も再帰的にwriteObjectメソッドを呼び出し続ける理由をいくつかのいずれかを説明してくださいできますか?
class Employee implements Serializable{
private String name;
private int age;
private void readObject(ObjectInputStream ois) throws IOException,ClassNotFoundException{
ois.defaultReadObject();
Employee emp = (Employee)ois.readObject();
emp.toString();
}
private void writeObject(ObjectOutputStream oos) throws IOException,ClassNotFoundException{
oos.defaultWriteObject();
Employee emp = new Employee("sumit",10);
oos.writeObject(emp);
}
public Employee(){
}
public Employee(String name, int age){
this.name = name;
this.age = age;
}
}
それはので、あなたが上書きされているという事実であるwriteObject
あなたの方法をEmployee
クラス。作成したときに、Employee
オブジェクトをして使用してそれを書き込もうとwriteObject
する方法を、それがにつながる再帰的に呼び出されるStackOverflow
エラー。
しかし、あなたが書いていない時にEmployee
適切にコードが実行するオブジェクト。
コメントに尋ね明確化につきとして---編集
あなたにはEmployee
、クラス、あなたが上書きされているwriteObject
ので、この方法を、いつでも、あなたが起動しようとするObjectOutputStream.writeObject
とEmployee
、パラメータとして、あなたのオーバーライドされたメソッドが呼び出されます。今すぐあなたのオーバーライドさでwriteObject
中Employee
クラスは、再度呼び出しているObjectOutputStream.writeObject
(oos.writeObject(emp);
パラメータ、したがって、と従業員との)writeObject
の方法Employee
クラスが再帰的に呼び出されます(新しいEmployeeオブジェクトのたびに)とあなたが得るのstackoverflowエラー。
今、あなたは再帰的に呼び出すしようとする場合にはthis
、キーワード、それはので、あなたが起動しようとするという事実のためであるObjectOutputStream.writeObject
のと同じインスタンスとEmployee
クラス。あたりとしてObjectOutputStream.writeObject
言及リンクの下にあるマニュアル:
https://docs.oracle.com/javase/7/docs/api/java/io/ObjectOutputStream.html
オブジェクトのグラフは、元のが書き込まれたときと同じ形状に復元することができるように、単一のオブジェクトに対する複数の参照は、参照共有機構を使用して符号化されます。
Infactは、あなたがあなたのメインメソッドのコード以下しようとした場合:
Employee emp = new Employee("sumit",10);
oos.writeObject(emp);
oos.writeObject(emp);
あなたが起動した場合、すなわちwriteObject
、同じオブジェクト上で複数回、それは一度だけ呼び出されます。