簡単な質問ですが、オブジェクトをシリアル化可能としてマークする場合、JavaBeanである必要がありますか?つまり、JavaBeanではないオブジェクトをシリアル化できますか?リスクはありますか?オブジェクトをシリアル化する場合は、常にオブジェクトをJavaBeanにすることをお勧めしますか?
4 に答える
あなたはそれを間違った方法で見ています。Java Beanは、次のようなクラスです。
1)Serializableを実装します
2)引数なしのコンストラクターを
持ちます3)プライベートメンバーとセッター/ゲッターを持ちます
だからあなたの質問
オブジェクトをシリアル化可能としてマークする場合、JavaBeanである必要がありますか?
後方にあります。インターフェイスを実装することにより、任意のクラスをシリアル化できます。すべてのシリアル化可能なクラスがJavaBeanを定義するわけではありません。
つまり、JavaBeanではないオブジェクトをシリアル化できますか?
はい。
オブジェクトをシリアル化する場合は、常にオブジェクトをJavaBeanにすることをお勧めしますか?
データのカプセル化を念頭に置いてクラスを設計することをお勧めします。これは、フィールドへのアクセスを直接制限し、必要に応じてセッターとゲッターを使用することを意味します。
もちろん、APIの観点からは、パブリックの引数なしコンストラクターを持つことは必ずしも必要ではありません。
クラスがJavaBeansであることに依存するライブラリを使用する場合は、実際にはJavaBean標準に従う必要があります。
Serializableはマーカーインターフェイスです。シリアル化可能なインターフェイスでマークした各オブジェクトは、ネットワーク経由で送信することも、ファイルに保存することもできます。たとえば、シリアル化可能なインターフェイスでクラスFooをマークすると、ファイル内のオブジェクトの状態を保護し、後で復元することができます。
public class Foo implements java.io.Serializable{
public String name;
}
public main(){
Foo foo = new Foo();
foo.name="test";
try
{
FileOutputStream fileOut = new FileOutputStream("foo.file");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(foo);
}
}
つまり、JavaBeanである必要はありません。Foo Objectの例のように、単純な古いJavaオブジェクトである可能性があります。
クラスのオブジェクトをシリアル化する場合、そのクラスは、単純なプロパティを持つBean(または)クラスに関係なく、シリアル化可能なインターフェイスを実装する必要があります。
オブジェクトをシリアル化するということは、その状態をバイトストリームに変換して、バイトストリームをオブジェクトのコピーに戻すことができるようにすることを意味します。Javaオブジェクトは、そのクラスまたはそのスーパークラスのいずれかがjava.io.Serializableインターフェースまたはそのサブインターフェースjava.io.Externalizableのいずれかを実装している場合にシリアライズ可能です。デシリアライズは、オブジェクトのシリアル化された形式をオブジェクトのコピーに戻すプロセスです。
このチュートリアルはあなたを助けるかもしれません
JavaBeanであるかどうかに関係なく、Serializableインターフェースを実装する任意のオブジェクトをシリアル化できます。
とは言うものの、オブジェクトをシリアライズ可能にするという決定は、クラスの特定の実装の詳細を固定し、将来の柔軟性を低下させるため、軽々しく行うべきではありません。
Serializableの実装については、こちらをご覧ください。