現在、あるアクティビティで作成した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を実装すればオブジェクトもアクティビティに渡せるということなので
その通りにやったつもりなのですが・・・。
なぜこうなってしまうのか原因がわかりません。
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
このへんかな?
http://d.hatena.ne.jp/daisuke-m/20100414/1271228 …
要するに、implements Serializable と書けばいいということではないよ、ということ。
回答ありがとうございます。ご紹介いただいたページを読みました。
Serializable についてよく理解することができました。
どうもプリミティブなフィールド以外はシリアライズは困難なようですね。
調べている時にわかった事ですが
「復元(読み込み)されるときスーパークラスがシリアライズ可能でない場合は、
そのデフォルトコンストラクターは呼ばれる。
「シリアライズ対象クラスがSerializableを実装しているのにスーパークラスが
Serializableを実装していない場合、スーパークラスが持っている変数の内容は
転送されない」
という事がわかりました。
つまり、転送しようとしているSocket2の親クラスSocketがSerializableを
実装していないので、SocketのデフォルトコンストラクターSocket()が復元されていたため
IsConnedted=Falseという初期値が入っていた、
ということだということで、今回の原因がわかりました。
さて、では実際にSocketを親クラスに持つクラスのシリアライズの方法ですが・・・
とても難しそうでわかりません><
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- ドライブ・ストレージ B550M Pro4マザーにM.2_SSD取付に関して 2 2023/04/15 02:07
- CPU・メモリ・マザーボード Socket AM4マザーに、レガシーなインタフェースが多数あるのはなぜ? 3 2023/02/17 10:47
- CPU・メモリ・マザーボード DELL Vostro 3268に付けられるCPUを教えてください。以下にspecを載せてます。 4 2022/10/24 11:19
- 英語 This paper focuses on the literature relevant to t 2 2022/12/02 09:41
- CPU・メモリ・マザーボード CPU クーラーにグリスを塗らなかったらどれぐらいまずいことになるのでしょうか AM4のsocket 3 2022/04/15 11:00
- CPU・メモリ・マザーボード BIOSTAR B660GTAのストレージ(M2、SATA)について 1 2023/02/17 20:11
- Bluetooth・テザリング PRIME Z390-PでWIFI&Bluetooth 2 2022/04/01 19:25
- 中学校 現在教育実習中です。 担当教科は英語で担当学年は中学3年生です。 来週から授業を担当しますが 指導教 2 2023/06/06 19:51
- CPU・メモリ・マザーボード emachines eme732z f22bというパソコンのCPU交換についてです。 CPU Pen 3 2022/08/25 22:53
- Instagram インスタグラムでフォロー し合っている人たちの アクティビティ履歴が突然 見れなくなってしまいました 2 2022/09/13 07:24
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
多人数のじゃんけんプログラム
-
C#でフォームのオブジェクト名...
-
Excelで =EMBED("Acrobat Docu...
-
COMコンポーネントって何?
-
Vbで通常使用するプリンターを...
-
bmp画像をjpegやpng画像に圧縮...
-
文字列でクラス型名を取得したい
-
Accessの連結・非連結オブジェ...
-
VBAのWindowオブジェクトとWork...
-
オブジェクト名をforループ内で...
-
Object型からDouble型へのキャスト
-
ArrayLsitのデータ取得
-
Listに格納されているオブジェ...
-
Listに格納されたオブジェクト...
-
JAVAからHTMLへ値を返す方法
-
Visual Studioでのbmpファイル...
-
.getElementById()のエラーにつ...
-
javaでは基本型の参照渡しは無...
-
LISTBOXの内容が更新されま...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
EXCEL VBAにて動的にCheckBOXを...
-
ワイルドカード<?>と型パラメー...
-
C#でフォームのオブジェクト名...
-
VBAのWindowオブジェクトとWork...
-
vb.net オブジェクト指向につい...
-
COMコンポーネントって何?
-
オブジェクトレベルとメタレベル
-
ビジュアルC++でボタンの有...
-
時間帯判定をする。
-
LISTBOXの内容が更新されま...
-
VBA 同じ名前のオブジェクトを...
-
オブジェクト名をforループ内で...
-
Object型からDouble型へのキャスト
-
ADO オブジェクトの渡し方
-
bmp画像をjpegやpng画像に圧縮...
-
Vbで通常使用するプリンターを...
-
戻り値がクラスオブジェクト
-
VBAでvlookup関数から、別シー...
おすすめ情報