内部クラスのシーケンス化の問題.
1759 ワード
今日はObjectOutputStreamを使用して内部クラスを保存しましたがjavaが放出されました.io.NotSerializableException
コード#コード#
例外:
異常原因分析:
1、非静的内部クラスは外部クラスのすべてのメンバーにアクセスすることができ、この中にはインスタンスフィールドと方法が含まれている.この目標を実現するために、非静的内部クラスは外部クラスのインスタンスオブジェクトに対する暗黙的な参照を記憶し、つまり外部クラスの一部のSerializableを実現していないデータは内部クラスに保存される.シーケンス化では、すべてのメンバー変数がSerializableであることが要求されます.
ソリューション:
1、外部クラスをシーケンス化する
2、内部クラスを静的内部クラスに変更する
------テストで問題を解決
コード#コード#
public class InnerClassSerializableTest {
class User implements Serializable {
private String name;
private String password;
private String email;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User [name=" + name + ", password=" + password + ", email="
+ email + "]";
}
}
@Test
public void serializableTest() throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream(128);
ObjectOutputStream oos;
oos = new ObjectOutputStream(baos);
oos.writeObject(new User());
oos.flush();
oos.close();
Assert.assertTrue(baos.toByteArray().length > 0);
}
}
例外:
java.io.NotSerializableException
異常原因分析:
1、非静的内部クラスは外部クラスのすべてのメンバーにアクセスすることができ、この中にはインスタンスフィールドと方法が含まれている.この目標を実現するために、非静的内部クラスは外部クラスのインスタンスオブジェクトに対する暗黙的な参照を記憶し、つまり外部クラスの一部のSerializableを実現していないデータは内部クラスに保存される.シーケンス化では、すべてのメンバー変数がSerializableであることが要求されます.
ソリューション:
1、外部クラスをシーケンス化する
2、内部クラスを静的内部クラスに変更する
------テストで問題を解決