2017-11-06 8 views
3

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でArraysObjectのあるPassing varargs to another method as different type

+3

ことだから彼らはそれをデザインしました。本当の質問ではありません。 – EJP

+5

配列が直列化できない場合は、どのように直列化しますか?のように、あなたはそれらを拡張することはできませんので、どのように配列のようなデータを書くのですか? –

+1

なぜ彼らはそれを設計する方法に疑問を呈していませんか?幸運にも、古いGolden Date APIのように、間違ったことはありませんでした。私が述べたように、デザインコンテナはクラスの継承性を継承する必要があります(おそらく簡単に実装されず、新しい機能が必要になる可能性があります)。 – Gartenzwerg

答えて

-1

ので、別の質問を議論するときに、この質問が来た、と彼らは、ディスクまたは一部に含む情報を格納するために使用することができますデータベース。

オブジェクトの状態がバイトの形で保存されると、別のシステムに転送され、状態から読み込んでクラスを取得することができます。

あなたがDBに保存する前にオブジェクトをシリアル化していない場合があります。このような同様の警告:「直列化可能」クラスの

フィールドは、のいずれかである必要があり、一時的または直列化可能

関連する問題