アプリ版:「スタンプのみでお礼する」機能のリリースについて

現在、あるアクティビティで作成したSocketクラスを継承したオブジェクトを
別のアクティビティに受け渡そうとしています。

このとき受け取った先のアクティビティで
ソケットの接続状態が変わってしまい、困っています。

原因がわかるかたおりましたら教えてください。よろしくお願いします。

----
手順
1.Serializableを実装したSocket継承クラス(Socket2)を作成
 (Socketオブジェクトをアクティビティに渡すために必要)

  class Socket2 extends Socket implements Serializable

2.アクティビティAでホストXXXとの接続を確立

Socket2 socket = new Socket2();
Socket2.connect(XXX);
★ここでsocketの属性IsConnectedを見るとTrueになっています

3.インテント作成
Intent intent = new Intent(context, ActivityB.class);

4.パラメータ設定
intent.putExtra("SOCKET", socket);

5.アクティビティBを起動
StartActivity(intent);

;

6.アクティビティBのOnCreate()でパラメータを取得
Bundle extras = getIntent().getExtras();
if(extras != null){
   socket = (Socket2)extras.getSerializable("SOCKET");
}
★ここでsocketの属性IsConnectedを見るとFalseになっています

変数socket自体はnullではないので何か値は渡ってきてはいるのですが
接続が切れているため、たとえば
socket.getInputStream()等をすると例外(IOException)が飛んできます。

またSocket2クラスに文字列の属性を追加した場合には、
その値は正しく渡せているようです。

Serializableを実装すればオブジェクトもアクティビティに渡せるということなので
その通りにやったつもりなのですが・・・。
なぜこうなってしまうのか原因がわかりません。

よろしくお願いします。

A 回答 (1件)

このへんかな?



http://d.hatena.ne.jp/daisuke-m/20100414/1271228 …

要するに、implements Serializable と書けばいいということではないよ、ということ。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。ご紹介いただいたページを読みました。
Serializable についてよく理解することができました。
どうもプリミティブなフィールド以外はシリアライズは困難なようですね。

調べている時にわかった事ですが
「復元(読み込み)されるときスーパークラスがシリアライズ可能でない場合は、
 そのデフォルトコンストラクターは呼ばれる。
「シリアライズ対象クラスがSerializableを実装しているのにスーパークラスが
 Serializableを実装していない場合、スーパークラスが持っている変数の内容は
 転送されない」
という事がわかりました。

つまり、転送しようとしているSocket2の親クラスSocketがSerializableを
実装していないので、SocketのデフォルトコンストラクターSocket()が復元されていたため
IsConnedted=Falseという初期値が入っていた、
ということだということで、今回の原因がわかりました。


さて、では実際にSocketを親クラスに持つクラスのシリアライズの方法ですが・・・
とても難しそうでわかりません><

お礼日時:2011/12/20 10:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!