web-dev-qa-db-ja.com

[直列化可能]とは何ですか?いつ使用するべきですか?

私はいくつかのクラスが[Serializable]属性を使うことを知りました。

  • それは何ですか?
  • いつ使うべきですか?
  • どのようなメリットがありますか?
292
kevin

それは何ですか?

.NET Frameworkアプリケーションでオブジェクトを作成するときは、データがメモリにどのように格納されるかを考える必要はありません。なぜなら.Net Frameworkがあなたのためにそれを世話しているからです。ただし、オブジェクトの内容をファイルに保存したり、オブジェクトを別のプロセスに送信したり、ネットワークを介して転送したりする場合は、別の形式に変換する必要があるため、オブジェクトの表現方法について検討する必要があります。 。この変換はSERIALIZATIONと呼ばれます。

直列化のための使用

シリアル化により、開発者はオブジェクトの状態を保存し、必要に応じてそれを再作成して、オブジェクトの格納とデータ交換を実現できます。シリアル化を通じて、開発者はWebサービスを使用してオブジェクトをリモートアプリケーションに送信したり、あるドメインから別のドメインにオブジェクトを渡したり、オブジェクトをファイアウォールを介してXML文字列として渡したり、セキュリティやユーザー固有の設定を維持できます。アプリケーション間の情報。

SerializableAttribute を型に適用して、この型のインスタンスを直列化できることを示します。クラスが SerializableAttribute インターフェースも実装している場合でも、 ISerializable を適用してください。

SerializableAttribute でマークされた型のすべてのパブリックフィールドおよびプライベートフィールドは、その型が ISerializable インターフェイスを実装して上書きしない限り、デフォルトでシリアル化されます。シリアル化プロセスデフォルトのシリアル化プロセスでは、 NonSerializedAttribute のマークが付いたフィールドは除外されます。直列化可能型のフィールドに、ポインター、ハンドル、またはその他の特定の環境に固有のデータ構造が含まれていて、別の環境では意味のあるように再構成できない場合は、 NonSerializedAttribute その分野へ。

詳しくは MSDN をご覧ください。

編集1

何かを直列化可能としてマークしない理由

データを転送または保存するときは、必要なデータだけを送信または保存する必要があります。そのため、転送の遅延やストレージの問題が少なくなります。そのため、シリアライズ時に不要なデータの塊を除外することができます。

348
CharithJ

[Serializable]属性の実用的な用途は次のとおりです。

  • バイナリシリアル化を使用してオブジェクトの状態を保存する。アプリケーション内のオブジェクトインスタンス全体をファイルまたはネットワークストリームに非常に簡単に「保存」してから、直列化復元によってそれらを再作成できます。System.Runtime.Serialization.Formatters.BinaryのBinaryFormatterクラスを確認してください。
  • Clipboard.SetData()を使用してオブジェクトインスタンスをクリップボードに格納できるクラスを書く - 直列化できないクラスはクリップボードに配置できません。
  • .NET Remotingと互換性のあるクラスを書く。一般に、アプリケーションドメイン間で受け渡すクラスインスタンス(MarshalByRefObjectから継承されているものを除く)は、シリアル化可能である必要があります。

これらは私が遭遇した最も一般的な使用例です。

38
Bradley Smith

直列化とは、オブジェクトを格納したり、メモリ、データベース、またはファイルに転送したりするために、オブジェクトをバイトのストリームに変換するプロセスです。

シリアライゼーションのしくみ

この図は、シリアル化の全体的なプロセスを示しています。

enter image description here

オブジェクトは、データだけでなく、バ​​ージョン、カルチャ、アセンブリ名など、オブジェクトの種類に関する情報を伝達するストリームにシリアル化されます。そのストリームから、データベース、ファイル、またはメモリに格納できます。

msdnの詳細

25
Mahbubur Rahman

元の質問はSerializableAttributeに関するものだったので、この属性はBinaryFormatterまたはSoapFormatterを使用する場合にのみ適用されることに注意してください。

いつ細部に注意を払うのか、それをいつ使用するのか、そしてその実際の目的は何なのかということを除いて、それは少し混乱します。

XMLやJSONのシリアル化とは関係ありません。

SerializableAttributeと共に使用されるのは、ISerializable InterfaceおよびSerializationInfoクラスです。これらはBinaryFormatterまたはSoapFormatterでのみ使用されます。

バイナリまたは石鹸を使用してクラスをシリアル化するつもりでない限り、[シリアル化可能]としてクラスにマークを付けてもかまいません。 XMLとJSONのシリアライザは、その存在さえ意識していません。

21
BLaminack

これは、シリアライゼーションのしくみの簡単な例です。私も同じことについて学んでいました、そして私は2つのリンクが有用であるとわかりました。 シリアライゼーションとは何か、そして.NETでそれをどのように行うことができるか

シリアライゼーションを説明するサンプルプログラム

あなたが上記のプログラムを理解しないならば、説明がある非常に単純なプログラムがここに与えられます。

18
Akshay

シリアライゼーション

直列化は、オブジェクトまたはオブジェクトのセットのグラフをストリームに変換するプロセスです。バイナリ直列化の場合はバイト配列です。

直列化の使用

  1. オブジェクトの状態をファイル、データベースなどに保存して後で使用すること。
  2. オブジェクトを同じマシン上のあるプロセスから別のプロセス(App Domain)に送信し、それを別のマシンで実行されているプロセスにネットワーク経由で送信すること。
  3. メインオブジェクトで作業しながら、元のオブジェクトのクローンをバックアップとして作成します。
  4. 一連のオブジェクトをシステムのクリップボードに簡単にコピーして、同じまたは別のアプリケーションに貼り付けることができます。

以下は、オブジェクトのシリアル化中に使用される便利なカスタム属性です

[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();
        }

    }
11