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 という機能が必要になってきます。
それ以外のケースでは、特に実装を意識しなくてもよいのかなと思います。