23

私は他の誰かのC#コードを見ていますが、公開列挙型の前に次の行があります。

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]

誰かがそのSerializableAttribute線が何であるかを平易な英語で説明できますか?

私はすでにこのページに出くわしました-それは私にはあまり意味がありませんでした-私はC#の初心者です。

4

4 に答える 4

69

これは実際には非常に微妙です...

表面的には、答えは単に「SerializableAttributeクラスのメタデータにを追加する」であり、その目的は、型をシリアル化できることをSerializableAttribute(などに)アドバタイズすることです。シリアル化のために明示的にアドバタイズされていないもののシリアル化を拒否します。これは、リモーティングを実装し、リモーティング境界を越えてデータが誤ってリークするのを防ぐために使用された結果である可能性があります。BinaryFormatterBinaryFormatterBinaryFormatter

ほとんどのシリアライザーはをにしないSerializableAttributeので、これはのようなものにのみ影響することに注意してくださいBinaryFormatter。たとえば、、、、JSON.NETまたはprotobuf-netのいずれもXmlSerializer実際には気にしDataContractSerializerません。JavaScriptSerializerSerializableAttribute

ただし、実際には、これは標準の属性ではありませんが、コンパイラによる特別な処理があります。

  • ほとんどの属性は技術的.custom instanceに値です(IL用語で)
  • ただし、実際にはCLIフラグSerializableAttributeにマップされます。.classserializable

これは意味を変更しませんが、:目新しい事実として、実際には属性SerializableAttributeとして実装されていません。

于 2012-09-17T14:31:57.237 に答える
12

System.SerializableAttributeは、そのクラスのインスタンスをシリアル化できることをランタイムに指定します

例えば。WCFサービス呼び出しでオブジェクトを返します。そのオブジェクトにこの属性があり、その中のすべてのオブジェクトがシリアル化可能である場合、ランタイムは、Webサービスが返すリソースのタイプに応じて、そのオブジェクトをJSONまたはXMLに変換します。

于 2012-09-17T14:25:06.440 に答える
4

これは、のための長い手です[Serializable]。クラスに、他の形式との間で「変換」できるものとしてタグを付けます。

一般的な例には、クラスの「シリアル化」から「JSONまたはXMLデータ構造」への変換、および「そのような構造からの同等の変換」が含まれます。

クラスを考えてみましょう

[Serializable]
class MyClass
{
    public string Mem1 {get; set;}
    public string Mem2 {get; set;}
}

...
MyClass mc = new MyClass;
mc.Mem1 = "Hello";
mc.Mem2 = "World";

JSON構造にシリアル化すると、次のようになります。

"{'Mem1':'Hello','Mem2':'World'}"

また、プロセスの双方向性を考えると、この形式の情報を受け取った場合(たとえば、Webサービスから戻ってきた場合)、このクラスのインスタンスにシリアル化して戻すことができます。

JSONの例に基づいて、名前空間に一連のクラスがあり、System.Web.Script.Serializationこれに役立ちます。特に、クラスはメソッドの提供をJavaScriptSerializer支援してくれます。Serialize()Deserialize

于 2012-09-17T14:24:54.830 に答える
-1

ドキュメントから:

クラスをシリアル化できることを示します

例については、ドキュメントを参照してください。

于 2012-09-17T14:24:10.060 に答える