📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
編集の要約なし |
|||
| 31行目: | 31行目: | ||
* 全ての例外クラスはシリアル化可能であるべきである。 | * 全ての例外クラスはシリアル化可能であるべきである。 | ||
*: 以下のような場合、例外クラスをシリアル化する必要がある。 | *: 以下のような場合、例外クラスをシリアル化する必要がある。 | ||
** ソフトウェアの実行中にスローされた例外オブジェクトが、ソフトウェアドメインの境界を越える場合 | *:* ソフトウェアの実行中にスローされた例外オブジェクトが、ソフトウェアドメインの境界を越える場合 | ||
** 例外の内容をログに出力する場合 | *:* 例外の内容をログに出力する場合 | ||
*: <br> | |||
*: 上記のようなシーンにおいて、例外クラスを使用しない場合もあるが、 | *: 上記のようなシーンにおいて、例外クラスを使用しない場合もあるが、 | ||
*: シリアル化の対応は簡単に行うことができるため、対応することにより、例外クラスの堅牢性が増す。 | *: シリアル化の対応は簡単に行うことができるため、対応することにより、例外クラスの堅牢性が増す。 | ||
<br> | |||
==== シリアル化とは ==== | |||
== シリアル化とは == | |||
シリアル化とは、オブジェクトをバイトストリームに変換する処理のことである。<br> | シリアル化とは、オブジェクトをバイトストリームに変換する処理のことである。<br> | ||
オブジェクトの現在の状態をファイルに書き出すような処理を行う。<br> | オブジェクトの現在の状態をファイルに書き出すような処理を行う。<br> | ||
| 47行目: | 47行目: | ||
また、シリアル化されたバイトストリームを元のオブジェクトに戻す処理のことを、逆シリアル化と呼ぶ。<br> | また、シリアル化されたバイトストリームを元のオブジェクトに戻す処理のことを、逆シリアル化と呼ぶ。<br> | ||
[https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/concepts/serialization/ シリアル化 (C#) | Microsoft Docs]<br> | [https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/concepts/serialization/ シリアル化 (C#) | Microsoft Docs]<br> | ||
<br> | <br> | ||
==== 例外クラスの作成 ==== | ==== 例外クラスの作成 ==== | ||
以下の例では、例外クラスを作成している。<br> | 以下の例では、例外クラスを作成している。<br> | ||
| 60行目: | 59行目: | ||
*: <br> | *: <br> | ||
* 例外クラスのシリアル化対応 | * 例外クラスのシリアル化対応 | ||
*: <code>SerializableAttribute</code>属性と4番目のコンストラクタにより、例外クラスは、ソフトウェアのドメイン境界を越えることができる。 | *: <code>SerializableAttribute</code>属性と4番目のコンストラクタにより、例外クラスは、ソフトウェアのドメイン境界を越えることができる。 | ||
*: <code>SerializableAttribute</code>属性がある全てのクラスは、フォーマッタを使用してシリアル化が可能になる。 | *: <code>SerializableAttribute</code>属性がある全てのクラスは、フォーマッタを使用してシリアル化が可能になる。 | ||
*: 特に、例外クラスに<code>SerializableAttribute</code>属性がある場合、例外がソフトウェアのドメイン境界を超える時、必要に応じて自動的にシリアル化を行う。 | *: 特に、例外クラスに<code>SerializableAttribute</code>属性がある場合、例外がソフトウェアのドメイン境界を超える時、必要に応じて自動的にシリアル化を行う。 | ||
*: <br> | *: <br> | ||
*: シリアル化されて、別のソフトウェアのドメインからスローされた例外オブジェクトを正しく受け取るためには、元の例外オブジェクトに戻す必要がある。 | *: シリアル化されて、別のソフトウェアのドメインからスローされた例外オブジェクトを正しく受け取るためには、元の例外オブジェクトに戻す必要がある。 | ||
*: これを、逆シリアル化と呼ぶ。 | *: これを、逆シリアル化と呼ぶ。 | ||
*: これを行うのが、4番目のコンストラクタとなる。 | *: これを行うのが、4番目のコンストラクタとなる。 | ||
*: <br> | *: <br> | ||
*: 4番目のコンストラクタは、フォーマッタが呼び出すために存在するため、設計者が明示的に呼び出すことはない。 | *: 4番目のコンストラクタは、フォーマッタが呼び出すために存在するため、設計者が明示的に呼び出すことはない。 | ||
*: また、呼び出されることを避けるため、<code>protected</code>修飾子を付加する。(フォーマッタは、アクセス修飾子に関係なく呼び出すことができる) | *: また、呼び出されることを避けるため、<code>protected</code>修飾子を付加する。(フォーマッタは、アクセス修飾子に関係なく呼び出すことができる) | ||
*: <br> | *: <br> | ||
*: 逆シリアル化コンストラクタが<code>public</code>修飾子の場合、任意のコードから不正なデータを渡して例外クラスのインスタンスを生成できる。 | *: 逆シリアル化コンストラクタが<code>public</code>修飾子の場合、任意のコードから不正なデータを渡して例外クラスのインスタンスを生成できる。 | ||
*: また、例外クラスの継承を禁止する(<code>sealed</code>修飾子を付加する)場合は、逆シリアル化コンストラクタに<code>private</code>修飾子を付加することもできる。 | *: また、例外クラスの継承を禁止する(<code>sealed</code>修飾子を付加する)場合は、逆シリアル化コンストラクタに<code>private</code>修飾子を付加することもできる。 | ||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
using System; | using System; | ||