回答:
.Netフレームワークアプリケーションでオブジェクトを作成する場合、データがメモリに格納される方法を考慮する必要はありません。.Net Frameworkが自動的に処理します。ただし、オブジェクトのコンテンツをファイルに保存したり、オブジェクトを別のプロセスに送信したり、ネットワークを介して送信したりする場合は、別の形式に変換する必要があるため、オブジェクトの表現方法を考慮する必要があります。この変換はSERIALIZATIONと呼ばれます。
シリアライゼーションにより、開発者はオブジェクトの状態を保存し、必要に応じてオブジェクトを再作成して、オブジェクトのストレージとデータ交換を提供できます。開発者はシリアライゼーションを通じて、Webサービスを介してオブジェクトをリモートアプリケーションに送信する、オブジェクトをあるドメインから別のドメインに渡す、ファイアウォールを介してXML文字列として渡す、セキュリティやユーザー固有のメンテナンスを行うなどのアクションを実行できます。アプリケーション間の情報。
SerializableAttribute
型に適用して、この型のインスタンスをシリアル化できることを示します。SerializableAttribute
クラスも実装している場合でも適用ISerializable
がシリアル化プロセスを制御するインターフェイスます。
型でシリアル化プロセスをオーバーライドするインターフェイスをSerializableAttribute
実装しない限り、でマークされた型のすべてのパブリックフィールドとプライベートフィールドはデフォルトでシリアル化されますISerializable
。デフォルトのシリアル化プロセスでは、でマークされたフィールドが除外されますNonSerializedAttribute
。シリアル化可能な型のフィールドに、特定の環境に固有のポインター、ハンドル、またはその他のデータ構造が含まれていて、異なる環境で意味のある再構成ができない場合は、適用することができますNonSerializedAttribute
、そのフィールドすること。
MSDNを参照をしてください。
編集1
何かをシリアライズ可能としてマークしない理由
データを転送または保存する場合、必要なデータのみを送信または保存する必要があります。そのため、転送の遅延やストレージの問題が少なくなります。したがって、シリアル化するときに不要なデータのチャンクをオプトアウトできます。
[Serializable]
属性のいくつかの実用的な用途:
BinaryFormatter
。System.Runtime.Serialization.Formatters.Binary のクラスを確認してください。Clipboard.SetData()
クラスの記述-シリアライズできないクラスはクリップボードに配置できません。MarshalByRefObject
)は、シリアル化可能でなければなりません。これらは、私が遭遇した最も一般的な使用例です。
元の質問はSerializableAttributeに関するものでしたので、この属性はBinaryFormatterまたはSoapFormatterを使用する場合にのみ適用されることに注意してください。
いつそれを使用するのか、そしてその実際の目的は何かについて、本当に細部に注意を払わない限り、それは少し混乱します。
XMLまたはJSONのシリアル化とは何の関係もありません。
SerializableAttributeと共に使用されるのは、ISerializableインターフェイスとSerializationInfoクラスです。これらもBinaryFormatterまたはSoapFormatterでのみ使用されます。
BinaryまたはSoapを使用してクラスをシリアル化するつもりがない限り、クラスを[Serializable]としてマークしないでください。XMLおよびJSONシリアライザーは、その存在すら認識していません。
Serializable
、属性が削除されたときはありませんでした。したがって、干渉が発生する可能性があります。
シリアル化のしくみの短い例を次に示します。私も同じことを学んでいて、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();
}
}
What is it?
stackoverflow.com/questions/3429921/what-does-serializable-mean