readObjectメソッドおよびwriteObjectを使用してカスタム・シリアライズ

クマールによって:

私は、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;
    }   
}
codeLover:

それはので、あなたが上書きされているという事実であるwriteObjectあなたの方法をEmployeeクラス。作成したときに、Employeeオブジェクトをして使用してそれを書き込もうとwriteObjectする方法を、それがにつながる再帰的に呼び出されるStackOverflowエラー。

しかし、あなたが書いていない時にEmployee適切にコードが実行するオブジェクト。

コメントに尋ね明確化につきとして---編集

あなたにはEmployee、クラス、あなたが上書きされているwriteObjectので、この方法を、いつでも、あなたが起動しようとするObjectOutputStream.writeObjectEmployee、パラメータとして、あなたのオーバーライドされたメソッドが呼び出されます。今すぐあなたのオーバーライドさでwriteObjectEmployeeクラスは、再度呼び出しているObjectOutputStream.writeObjectoos.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、同じオブジェクト上で複数回、それは一度だけ呼び出されます。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=221235&siteId=1