6

次のようなシリアライズ可能な属性を持つ例をいくつか見てきました。

[Serializable()]
            public class sampleClass
            {
                public int Property1{ get; set; }
                public string Proerty2{ get; set; }

                public sampleClass() { }
                public sampleClass(int pr1, int pr2)
                {
                    pr1 = pr1;
                    Name = pr2.ToString();
                }
            }

これがどのように機能するかをよく理解していませんでしたが、msdnから:

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

しかし問題は、私のコード例ではそれが役に立たないことです。データベースからデータを取得するために使用される単なるオブジェクトであり、特別なものではありません。シリアライゼーションを使用する場合と使用しない場合のその他の用途は何ですか。たとえば、シリアル化はより安全なので、常に使用する必要がありますか? このままでは遅くなるの?

更新: 素敵な回答をありがとう

4

5 に答える 5

6

シリアル化は、データの表現をプロセス境界内外に移動する場合に役立ちます。

オブジェクトをディスクに保存することは、多くのチュートリアルで見られる簡単な例です。

より一般的には、シリアライゼーションは、Web サービスとの間でデータを転送したり、データベースとの間でデータを保持したりするために使用されます。

于 2012-06-08T19:46:09.677 に答える
5

一般的にシリアル化を使用する理由については、いくつかの回答で説明されています。特定のクラスに属性がある理由も知りたいようで、[Serializable]なぜそれが行われたのか疑問に思っています。

ASP.NET では、既定のセッション状態ストレージはInProc、任意のオブジェクトを参照として格納し、ヒープに残すことができます。これは、セッション状態を格納するための最もパフォーマンスの高い方法ですが、単一のワーカー スレッドを使用している場合、またはワーカー スレッドが変更された場合にすべてのセッション状態を自動的に再構築できる場合 (可能性は低い) にのみ機能します。他の状態ストレージ モード (StateServerおよびSQL Server) の場合、すべてのセッション状態オブジェクトはシリアル化可能である必要があります。これは、ASP.NET エンジンがバイナリ シリアル化を使用してこれらのオブジェクトをシリアル化してからストレージ メディアに送信するためです。

あなたの場合、を使用している可能性がありますInProc。ただし、セッション状態で使用されるすべてのクラスを引き続きマークし、Serializableそのようにテストする理由の 1 つは、将来これを変更する必要がある可能性があるためです (たとえば、Web ファームを使用するため)。これを念頭に置いてセッション状態クラスを設計しないと、将来的に移行を行うのが非常に難しくなります。

また、Serializable属性を削除でき、プログラムが 1 つの環境で「動作する」からといって、別の環境でも動作するとは限りません。たとえば、Visual Studio テスト Web サーバー (常にInProcセッション状態モードを使用する) インスタンスや開発 IIS インスタンスでは問題なく動作する可能性がありますが、運用 IIS インスタンスは別のストレージ モードを使用するようにセットアップされている可能性があります。

これらの環境/構成の違いは、必ずしも ASP.NET アプリケーションに限定されるわけではありません。これを実行できる他のアプリケーション エンジンや、実行できるスタンドアロン アプリケーションもあります (この種の構成可能な環境を構築することは難しくありません)。

最後に、さまざまなアプリケーションで使用される可能性があるライブラリを使用している可能性があります。シリアライズ可能な方法で状態を保存する必要があるものもあれば、そうでないものもあります。

これらの要因のため、少なくともライブラリを構築するときは、単純な値クラスまたは状態管理クラスを .xml でマークすることを検討することをお勧めし[Serializable]ます。これにより、これらのクラスをテストする作業が増加し、シリアル化できるものには制限があることに注意してください (つまり、開いている外部リソースをシリアル化できないため、ソケット参照またはオープン ファイル参照を含むクラスはシリアル化の対象にならない可能性があります)。これを使いすぎないでください。

[Serializable]使用が遅くなるかどうか尋ねました。いいえ、そうではありません。この属性は、パフォーマンスに直接影響しません。ただし、オブジェクトをシリアル化するようにアプリケーション環境が変更された場合、はい、パフォーマンスに影響します。オブジェクトをヒープに格納するよりも遅いのは、シリアライズとデシリアライズの動作です。[いくつかのルーチンは、属性を探してSerializableからシリアル化を選択するように作成できることに注意してください。ただし、これはまれです。通常、これは ASP.NET のようなものであり、ストア メディアを変更するかどうかの決定は管理者またはユーザーに任されています。]

于 2012-06-09T01:21:48.907 に答える
3

あなたが提供するMSDNの引用は、シリアライゼーションがいつ役立つかを説明しています:データの転送または保存のため。ファイルへの書き込みはシリアル化であり、オブジェクトをネットワーク経由で送信するにはシリアル化が必要です。

おそらくデータベースから単一のアプリケーションにオブジェクトを移入するだけの場合は、シリアライゼーションはまったく問題になりません。シリアル化のためにクラスをイメージ化しても、セキュリティやパフォーマンスに影響はありません。必要がない場合は、心配する必要はありません。

[Serializable]主に に関連してBinaryFormatterいますが、実際にはそれよりも多くのシリアライザーがあることに注意してください。例: JSON または XML を介してオブジェクトを公開したい場合があります。どちらもシリアル化が必要ですが、どちらも必要ありません[Serializable]

于 2012-06-08T19:50:54.480 に答える
0

シリアライゼーションを使用する場合と使用しない場合のその他の用途は何ですか。

実用的な例を 1 つ挙げましょう。私のアプリケーションの 1 つで、要求ファイルと応答ファイルのXMLスキーマ (ファイル) が与えられました。要求ファイルを解析し、情報を処理していくつかのテーブルに保存する必要があります。後で、それに応じて応答ファイルを準備し、クライアントに送り返す必要があります。XSDXMLXMLXML

以前は、スキーマに基づいてクラスXsd2Codeを生成していました。C#したがって、リクエストXMLファイルを解析することは、生成されたリクエスト クラス オブジェクトに単純にデシリアライズすることです。XML次に、リクエストファイルに表示される方法で、オブジェクトからプロパティにアクセスできます。応答XMLファイルの生成は、生成された応答クラス オブジェクトからシリアル化するだけで、コードに入力します。このようにして、ファイルではなく C# オブジェクトをXML操作できます。それが理にかなっていることを願っています。

たとえば、より安全なため、常にシリアル化を使用する必要があります

これはセキュリティとはまったく関係ないと思います。

于 2012-06-09T17:19:42.187 に答える
0

簡単な例: アプリケーション設定を保存するためのカスタム シェイプがあるとします。

namespace My.Namespace
{
    [Serializable]
    public class Settings
    {
        public string Setting1 { get; set; }

        public string Setting2 { get; set; }
    }
}

次に、ファイルを xml ファイルとして持つことができます。

<?xml version="1.0" encoding="utf-8" ?>
<Settings>
  <Setting1>Foo</Setting1>
  <Setting2>Bar</Setting2>
</Settings>

XmlSerializer を使用すると、設定を単純にシリアル化および逆シリアル化できます。

また、ASP.NET ViewState に入れたい場合は、形状をシリアライズ可能にする必要があります。

これらは非常に基本的な例ですが、その有用性を示しています

于 2012-06-08T19:54:15.043 に答える