私はいくつかのクラスが[Serializable]
属性を使うことを知りました。
.NET Frameworkアプリケーションでオブジェクトを作成するときは、データがメモリにどのように格納されるかを考える必要はありません。なぜなら.Net Frameworkがあなたのためにそれを世話しているからです。ただし、オブジェクトの内容をファイルに保存したり、オブジェクトを別のプロセスに送信したり、ネットワークを介して転送したりする場合は、別の形式に変換する必要があるため、オブジェクトの表現方法について検討する必要があります。 。この変換はSERIALIZATIONと呼ばれます。
シリアル化により、開発者はオブジェクトの状態を保存し、必要に応じてそれを再作成して、オブジェクトの格納とデータ交換を実現できます。シリアル化を通じて、開発者はWebサービスを使用してオブジェクトをリモートアプリケーションに送信したり、あるドメインから別のドメインにオブジェクトを渡したり、オブジェクトをファイアウォールを介してXML文字列として渡したり、セキュリティやユーザー固有の設定を維持できます。アプリケーション間の情報。
SerializableAttribute
を型に適用して、この型のインスタンスを直列化できることを示します。クラスが SerializableAttribute
インターフェースも実装している場合でも、 ISerializable
を適用してください。
SerializableAttribute
でマークされた型のすべてのパブリックフィールドおよびプライベートフィールドは、その型が ISerializable
インターフェイスを実装して上書きしない限り、デフォルトでシリアル化されます。シリアル化プロセスデフォルトのシリアル化プロセスでは、 NonSerializedAttribute
のマークが付いたフィールドは除外されます。直列化可能型のフィールドに、ポインター、ハンドル、またはその他の特定の環境に固有のデータ構造が含まれていて、別の環境では意味のあるように再構成できない場合は、 NonSerializedAttribute
その分野へ。
詳しくは MSDN をご覧ください。
編集1
何かを直列化可能としてマークしない理由
データを転送または保存するときは、必要なデータだけを送信または保存する必要があります。そのため、転送の遅延やストレージの問題が少なくなります。そのため、シリアライズ時に不要なデータの塊を除外することができます。
[Serializable]
属性の実用的な用途は次のとおりです。
BinaryFormatter
クラスを確認してください。Clipboard.SetData()
を使用してオブジェクトインスタンスをクリップボードに格納できるクラスを書く - 直列化できないクラスはクリップボードに配置できません。MarshalByRefObject
から継承されているものを除く)は、シリアル化可能である必要があります。これらは私が遭遇した最も一般的な使用例です。
直列化とは、オブジェクトを格納したり、メモリ、データベース、またはファイルに転送したりするために、オブジェクトをバイトのストリームに変換するプロセスです。
シリアライゼーションのしくみ
この図は、シリアル化の全体的なプロセスを示しています。
オブジェクトは、データだけでなく、バージョン、カルチャ、アセンブリ名など、オブジェクトの種類に関する情報を伝達するストリームにシリアル化されます。そのストリームから、データベース、ファイル、またはメモリに格納できます。
元の質問はSerializableAttributeに関するものだったので、この属性はBinaryFormatterまたはSoapFormatterを使用する場合にのみ適用されることに注意してください。
いつ細部に注意を払うのか、それをいつ使用するのか、そしてその実際の目的は何なのかということを除いて、それは少し混乱します。
XMLやJSONのシリアル化とは関係ありません。
SerializableAttributeと共に使用されるのは、ISerializable InterfaceおよびSerializationInfoクラスです。これらはBinaryFormatterまたはSoapFormatterでのみ使用されます。
バイナリまたは石鹸を使用してクラスをシリアル化するつもりでない限り、[シリアル化可能]としてクラスにマークを付けてもかまいません。 XMLとJSONのシリアライザは、その存在さえ意識していません。
これは、シリアライゼーションのしくみの簡単な例です。私も同じことについて学んでいました、そして私は2つのリンクが有用であるとわかりました。 シリアライゼーションとは何か、そして.NETでそれをどのように行うことができるか 。
あなたが上記のプログラムを理解しないならば、説明がある非常に単純なプログラムがここに与えられます。
シリアライゼーション
直列化は、オブジェクトまたはオブジェクトのセットのグラフをストリームに変換するプロセスです。バイナリ直列化の場合はバイト配列です。
直列化の使用
以下は、オブジェクトのシリアル化中に使用される便利なカスタム属性です
[Serializable] - >オブジェクトの直列化可能をマークするときに使われます[NonSerialized] - >そうでないときに使われますオブジェクトのフィールドをシリアル化したい[OnSerializing] - >オブジェクトをシリアライズしながら何らかのアクションを行いたいときに使います[OnSerialized] - >ですオブジェクトをストリームにシリアル化した後に何らかのアクションを実行したいときに使用します。
以下は直列化の例です
[Serializable]
internal class DemoForSerializable
{
internal string Fname = string.Empty;
internal string Lname = string.Empty;
internal Stream SerializeToMS(DemoForSerializable demo)
{
DemoForSerializable objSer = new DemoForSerializable();
MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, objSer);
return ms;
}
[OnSerializing]
private void OnSerializing(StreamingContext context) {
Fname = "sheo";
Lname = "Dayal";
}
[OnSerialized]
private void OnSerialized(StreamingContext context)
{
// Do some work after serialized object
}
}
これが呼び出しコードです
class Program
{
string fname = string.Empty;
string Lname = string.Empty;
static void Main(string[] args)
{
DemoForSerializable demo = new DemoForSerializable();
Stream ms = demo.SerializeToMS(demo);
ms.Position = 0;
DemoForSerializable demo1 = new BinaryFormatter().Deserialize(ms) as DemoForSerializable;
Console.WriteLine(demo1.Fname);
Console.WriteLine(demo1.Lname);
Console.ReadLine();
}
}