2017-01-11 10 views
1

インターフェイスは、私が説明しましょう:Serializeを私はインターフェイスを持っているそのコンストラクタでオブジェクトをシリアル化しようとしている

これでオブジェクトクラス:

public class MyObj implements Serializable{ 
    private static final long serialVersionUID = -29238982928391L; 
    private MyCallback onMyCallback; 
    private String shortcutsText; 

    public MyObj(String shortcutsText, MyCallback onMyCallback){ 
     this.shortcutsText = shortcutsText; 
     this.onMyCallback = onMyCallback; 
    } 

    public MyCallback getOnMyCallback() { 
     return onMyCallback; 
    } 
} 

これはMyCallbackですインターフェイス:

public interface MyCallback extends Serializable { 
    long serialVersionUID = -1306760703066967345L; 
    void onMyCallbackClickListener(); 
} 

しかし、私はそれを書くときに(outはです):

MyCallback myCallback = new MyCallback() { 
      @Override 
      public void onMyCallbackClickListener() { 
       Toast.makeText(getApplicationContext(), "TEST!", Toast.LENGTH_LONG).show(); 
      } 
     }; 
out.writeObject(myCallback); 

かと:

out.writeObject(new MyObj("Test", myCallback)); 

それはスロー:

をjava.io.NotSerializableException

答えて

1

匿名内部クラスはシリアライズされません。ここで良い説明を見てください:NotSerializableException on anonymous class

+0

に従って私は非同期的に2つのプロセス間のインターフェイスを渡すのですか?AIDLは私を助けないので –

+0

あなたはそれを実際のクラスに昇格させることができます。その後、シリアル化されます。しかし、Javaオブジェクトを直列化して渡すことは、とにかく本当に良いアイデアではありません。いくつかのデータバインディングツールを手に入れ、JSONなどを送信します。 –

0

"ローカルクラスと匿名クラスを含む内部クラス(つまり、静的メンバークラスではないネストされたクラス)のシリアライズは強くお勧めします"。だから、あなたはこのように書くことはできません。

MyCallback myCallback = new MyCallback() { @Override public void onMyCallbackClickListener() { Toast.makeText(getApplicationContext(), "TEST!", Toast.LENGTH_LONG).show(); } };

+0

..私はどのように非同期的に2つのプロセス間のインターフェイスを渡すのですか?..なぜならAIDLは私を助けません –

0

匿名内部クラスをシリアライズすることができないため、この例外を得ました。

+0

..私は2つのプロセス間のインターフェイスを非同期的に渡すのですか? –

1

interfaceまたはabstract classをシリアル化することはできません。java.io.Serializableとプリミティブ型を実装する具体的なクラスのみが継承できます。シリアライゼーションは、情報/データを転送するためのものです。次のような記述ができても、インターフェイスをシリアル化できるわけではありません。

public static class MyObj implements Serializable{ 
    private static final long serialVersionUID = -29238982928391L; 

    private String text; 
    private MyCallback callback; 

    MyObj(String text, MyCallback callback){ 
     this.text = text; 
     this.callback = callback; 
    } 

    MyCallback getCallback(){ 
     return callback; 
    } 

} 

interface MyCallback extends Serializable{ 
} 

static class MyCallbackImpl implements MyCallback { 
    private static final long serialVersionUID = -19238982928391L; 
} 

public static void main(String args){ 
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
    ObjectOutputStream out = new ObjectOutputStream(byteArrayOutputStream); 

    MyCallback tout = new MyCallbackImpl(); 
    System.out.println(tout.toString()); 
    out.writeObject(tout); 

    MyObj obj = new MyObj("test", tout); 
    out.writeObject(obj); 
    System.out.println(obj.getCallback()); 
    out.close(); 
} 

それは実際に連載された具象クラスMyCallbackImplです。私たちは、出力から伝えることができます:

[email protected] 
[email protected] 

他の回答がシリアライズされ得ることができない、匿名クラス、ローカルクラスと非static内部クラスに述べたように、どのように..so詳細な説明here

関連する問題