私はいくつかのコードレビューを行っていますが、シリアル化できないフィールドを含むシリアル化可能なクラスに出くわしました。そのフィールドは、一時的なものとして宣言されていません。この種のコードは、コードの臭いと呼ぶことができますか?はいの場合、なぜですか?
public class A implements Serializable{
private B field ; // B is non serializable
}
私はいくつかのコードレビューを行っていますが、シリアル化できないフィールドを含むシリアル化可能なクラスに出くわしました。そのフィールドは、一時的なものとして宣言されていません。この種のコードは、コードの臭いと呼ぶことができますか?はいの場合、なぜですか?
public class A implements Serializable{
private B field ; // B is non serializable
}
オブジェクトの実行時間タイプがシリアル化できない場合、シリアル化しようとすると例外がスローされます。
たとえば、これはシリアル化します。
java.io.*をインポートします。
public class Test implements Serializable {
private Object object;
public static void main(String[] args) throws Exception {
Test test = new Test();
test.object = "";
// Now serialize test
}
}
これにより適切なファイルが作成されますが、test.object
がに設定されている場合はnew Object()
、例外がスローされます。
B
抽象クラスであり、すべての具象サブクラスがシリアル化可能でない限り、それは単なるコードの臭いではありません。または、の値field
がシリアル化可能またはnullでない限り、シリアル化されないという他の方法を知っている場合は、バグです。
これにより、オブジェクトをシリアル化しようとすると例外が発生します(フィールドがnullであるか、実際のオブジェクトがのシリアル化可能なサブクラスである場合を除くB
)。
一時的またはシリアル化可能にする(または独自のシリアル化方法を実装する)必要があります。
これはフィールドではありませんが、このフィールドが指すオブジェクトがNotSerializableExceptionを引き起こす可能性があります。たとえば、field
がnullの場合、例外はありません。またはfield
、BのSerializableサブクラスであるCのインスタンスを指している場合、例外はありません。
をシリアル化しようとすると、エラーが発生しますA
。シリアル化できないためB
です。コードの臭いです。