質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

2回答

5077閲覧

実務で目にしたSerializableを理解したい

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

3クリップ

投稿2021/07/15 15:30

前提・実現したいこと

java開発3ヶ月目のものです。実務でSerializableという記載を目にしたため、
調べているのですが理解が進まないためご教授いただきたいです。

発生している問題・エラーメッセージ

https://daisuke-m.hatenablog.com/entry/20100414/1271228333
https://qiita.com/NBT/items/9f76c9fd1c7a90506658
https://java.keicode.com/lang/io-object-serialize.php
上記のサイトで調べたりしましたが継承とは違うけど似ているものなのかな。。ぐらいの理解です。
具体的に分かってない部分としては
・どのような時に使われるのか、継承との違い
・そもそもjavaオブジェクトをファイルに出力するとはどういうことなのか
上記のような内容です。

該当のソースコード

import java.io.Serializable;

public abstract class BaseEntity implements Serializable{

}

例ですが上記のような形で使われているのを目にしました。

試したこと

上記のクラスをSerializableを使用せずに継承するなどしても特に問題が発生していないためSerializableに疑問を感じています。

補足情報(FW/ツールのバージョンなど)

開発ツールはeclipse
Spring Bootを用いて開発しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

javahack

2021/07/15 15:41

”実務でSerializableという記載を目にした”のなら、実例はそこにあるわけですよね。周りの人に聞くのが一番早くて理解しやすのではないでしょうか。
hoshi-takanori

2021/07/16 00:16

「継承との違い」というのは、継承とインターフェイスの違いでしょうか? 通常、インターフェイスはそれを実装するクラスが持つべきメソッドを宣言するために使われますが、Serializable にはメソッドは宣言されておらず、シリアライズ可能なクラスであるという目印として使われます。
guest

回答2

0

Serializable、難しいですね。
私も何がなにかよくわからないでいた期間がながかったので、そこを疑問に感じるのはよくわかります。
そんな中で参考文献にあげたブログをみつけたのは大変センスのある方だなとかんじました。
最近の、特にJavaのサンプルプログラムにあるようなToDoアプリなどで
「HTTPリクエストを受け取って、DBにデータを格納する・参照する」という範囲ではまず使わないので使って覚える経験も少なくなったのではと思います。
質問者様はすでに退会されてしまったので、私の回答を見ていただける機会はないかもしれませんが記載させていただこうと思います。

質問されている順番と逆になりますが、以下が私の知っている内容です。

・そもそもjavaオブジェクトをファイルに出力するとはどういうことなのか

「class インスタンス自体をテキストファイルに書き出す」というのがイメージしやすい、ありがちなユースケースかなと思います。
たとえば、Serializable な Person というクラスがあった場合に、ファイルに Person の情報を書き出す場合を以下。

Java

1Person person = new Person("name") 2var writer = new ObjectInputStream(new FileInputStream("filename")); 3write.writeObject(person);

どういうケースに使うかというと、以下のケースの場合に利用します。

  • 単純にファイル形式に書き出して取り出したい

(この場合でも最近はCSVやJSONなどの特定のフォーマットに変換し、文字列で出力するのでSerializable を使うことはほぼないかも)

  • サーバー上のアプリケーションを一旦停止したあとに、再度起動して停止前の情報を再利用したい

メモリ上のデータだと、アプリケーションを停止するとその情報を失われてしまうので、不揮発性の記憶領域に書き出す必要のある場合は存在するのは承知のこととは思います。
WebアプリケーションだとDBに保存するのが多いと思うのですが、
(サーバーやクラウドではなく)PC上で動作するようなアプリケーションの場合はローカルに、
もしくはDBを使わない・使えないケースでファイルとして書き出すケースがあります。

継承との違い

「extends ではなく、implements を使っているのはなぜか」という質問の場合は、
これが class や abstract ではなく、interface のためです。
そういう文法規則や機能だと思っていただければと思います。

「他の class や interface を継承・実装した場合の制約が Serializable にないのはなぜか」という質問でしたら、
Serializable は(参考にされたブログにもありますが)メソッド定義なども特にされていない、マーカーインターフェースというカテゴリのものだからです。
継承や実装をすると、親のクラスから機能を与えてもらうことができますが、
Serializable はこちらが機能を与える側になるからになります。
Serializable を実装したクラスのインスタンスをライブラリのメソッドなどに渡したときに
エラーにならないようにこちらで機能を実装する必要があります。

どのような時に使われるのか

現在だと以下のケースの場合は、今でも Serializable を使用する必要があります。

  • ObjectInputStream でファイルに書き出すとき
  • キャッシュサーバーのライブラリをつかって、オブジェクトを保存する時(Redis とか?)

https://docs.spring.io/spring-data/redis/docs/1.0.x/api/org/springframework/data/redis/serializer/package-summary.html

ObjectInputStream はオブジェクトの場合は、Serializable を使っていないと例外が発生して保存できません。
キャッシュサーバーのライブラリでオブジェクトの保存する場合は、Serializable を使う必要があります

オブジェクトという構造から、バイト列などの直列化し、さらにその情報をオブジェクトにもどしして処理を行う必要のある場合に Serializable という機能が必要になってきます。
それ以外のケースでは、特に実装を意識しなくてもよいのかなと思います。

投稿2021/07/26 15:24

kiino

総合スコア557

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

・どのような時に使われるのか、継承との違い

疑問が意味不明。継承は比較対象ですらない。

・そもそもjavaオブジェクトをファイルに出力するとはどういうことなのか

読んで字の如く。文字通り解釈すればいい。

そもそも疑問に思ったのなら5秒でググればわかると思うけども、何を調べて質問したんだろう。

インタフェースSerializable

シリアライズ

投稿2021/07/15 16:32

gentaro

総合スコア8947

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問