0

My doubt is using Scenario 1 it is possible to achieve serialization . If I extend one abstract class which is serializable by many sub classes means , is this possible to achieve ?. As I tried with Scenario 2.

Serializable will be applicable for all beans or not,Please help me.

my doubt scenario 1 and scenario 2 will be same or different.

//method to send message ::: sendMsgs(SerializableObject)

Scenario 1:

public class EmailMaster implements Serializable 
{
// setters and getters
}

Scenario 2:

public abstract class MessageBean implements Serializable 
{ 
}

//whether EmailMaster and EmailEvent  will become serializable ?

public class EmailMaster extends MessageBean 
{
// setters and getters



public class EmailEvent extends MessageBean 
{
// setters and getters
}
4

3 に答える 3

2

これはする必要がありますSerialilzableを拡張すると、デフォルトMessageBeanのすべての拡張クラスは抽象クラスからインターフェースをMessageBean継承します。SerializableMessageBean

serialVersionUID各拡張(サブ)クラスに一意に割り当てることをお勧めします。

編集:シリアライゼーションの観点から、scenario1sceanrio2は違いはありませんが、理論的には に追加の抽象クラスがありsceario2、クラスで利用できるメソッド/属性をさらに持つことができるため、異なりますEmailMaster

両方のシナリオで:sendMsgs(SerializableObject)動作するはずです。中間の抽象クラスの必要性に基づいて、sceanrio1 と scenario2 の間で決定を下します。他の目的で抽象クラスが必要ない場合は、シナリオ 1 を使用してください。

于 2012-11-16T05:15:34.397 に答える
2

Serializable他のインターフェースと同様に、抽象クラスのすべてのサブクラスによって継承されます。

A が を実装する場合、ASerializableを拡張するクラスは何であれSerializable

したがって、両方のシナリオが機能しますが、いずれにしても、具体的な Serializable クラスには引数なしのコンストラクターが必要です。次のシリアライズ可能な Javadocを参照してください。

クラスのシリアライズ可能性は、java.io.Serializable インターフェイスを実装するクラスによって有効になります。このインターフェイスを実装しないクラスは、状態がシリアライズまたはデシリアライズされません。シリアライズ可能なクラスのすべてのサブタイプは、それ自体がシリアライズ可能です。シリアライゼーション インターフェイスにはメソッドやフィールドがなく、シリアライズ可能であることのセマンティクスを識別するためだけに機能します。

シリアル化できないクラスのサブタイプをシリアル化できるようにするために、サブタイプは、スーパータイプの public フィールド、protected フィールド、および (アクセス可能な場合) package フィールドの状態を保存および復元する責任を負う場合があります。サブタイプは、それが拡張するクラスに、クラスの状態を初期化するためのアクセス可能な引数なしのコンストラクターがある場合にのみ、この責任を負うことができます。そうでない場合、Serializable クラスを宣言するとエラーになります。エラーは実行時に検出されます。

さらに、Serial Version IDオブジェクトの について:

シリアル化ランタイムは、シリアル化可能な各クラスに、serialVersionUID と呼ばれるバージョン番号を関連付けます。これは、シリアル化されたオブジェクトの送信側と受信側が、シリアル化に関して互換性のあるそのオブジェクトのクラスを読み込んでいるかどうかを検証するために、逆シリアル化中に使用されます。受信者が、対応する送信者のクラスとは異なる serialVersionUID を持つオブジェクトのクラスをロードした場合、逆シリアル化により InvalidClassException が発生します。シリアル化可能なクラスは、「serialVersionUID」という名前のフィールドを宣言することによって、独自の serialVersionUID を明示的に宣言できます。このフィールドは、静的、最終、および long 型である必要があります。

ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;  

シリアライズ可能なクラスが serialVersionUID を明示的に宣言しない場合、シリアライゼーション ランタイムは、Java(TM) Object Serialization Specification で説明されているように、クラスのさまざまな側面に基づいて、そのクラスのデフォルトの serialVersionUID 値を計算します。ただし、デフォルトの serialVersionUID 計算は、コンパイラの実装によって異なる可能性があるクラスの詳細に非常に敏感であり、逆シリアル化中に予期しない InvalidClassExceptions が発生する可能性があるため、すべてのシリアル化可能なクラスで serialVersionUID 値を明示的に宣言することを強くお勧めします。

于 2012-11-16T05:15:59.823 に答える
1

試す

Serializable emailMaster = new EmailMaster();

それが機能する場合EmailMaster は、 Serializable -aです。AFAIK、それは間違いなくうまくいくはずです。

于 2012-11-16T05:13:27.087 に答える