JLSでは、「すべての配列型は、Cloneableおよびjava.io.Serializableインタフェースを実装しています。 (JLS 10.8)。Java内のすべての配列が直列化可能であるのはなぜですか?
したがって、直列化不能クラス(例えば、Object)の配列は直列化可能であり、不適切に使用されると実行時例外が発生する可能性があります。
私の意見では、これは設計の欠陥です。配列(および他のすべての種類のコンテナ)はクラスの継承性を継承する必要があります。
例:
public void foo(Serializable params) {
// do sth that requires serializing the param
}
public void bar() {
List<SerializableObject> serializableObjectList = null;
foo(serializableObjectList); // error: List is not serializable
ArrayList<NotSerializableObject> NotSerializableObjectlist = null;
foo(NotSerializableObjectlist); // no error here
Object[] array = null;
foo(array); // no error here
}
注:JavaでArrays
がObject
のあるPassing varargs to another method as different type
ことだから彼らはそれをデザインしました。本当の質問ではありません。 – EJP
配列が直列化できない場合は、どのように直列化しますか?のように、あなたはそれらを拡張することはできませんので、どのように配列のようなデータを書くのですか? –
なぜ彼らはそれを設計する方法に疑問を呈していませんか?幸運にも、古いGolden Date APIのように、間違ったことはありませんでした。私が述べたように、デザインコンテナはクラスの継承性を継承する必要があります(おそらく簡単に実装されず、新しい機能が必要になる可能性があります)。 – Gartenzwerg