C# では、インスタンスをシリアル化する場合、オブジェクトの型を属性XmlSerializer
でマークする必要はありません。[Serializable]
ただし、 などの他のシリアル化アプローチでは、クラスをまたはDataContractSerializer
としてマークする必要があります。[Serializable]
[DataContract]
シリアル化要件に関する標準またはパターンはありますか?
C# では、インスタンスをシリアル化する場合、オブジェクトの型を属性XmlSerializer
でマークする必要はありません。[Serializable]
ただし、 などの他のシリアル化アプローチでは、クラスをまたはDataContractSerializer
としてマークする必要があります。[Serializable]
[DataContract]
シリアル化要件に関する標準またはパターンはありますか?
これは、XmlSerializer がパブリック フィールド/プロパティのみをシリアル化するためです。他の形式のシリアライゼーションでは、潜在的なセキュリティ リスクを構成するプライベート データをシリアライズする可能性があるため、属性を使用して「オプトイン」する必要があります。
セキュリティだけが問題ではありません。簡単に言えば、シリアル化は特定のクラスに対してのみ意味があります。たとえば、「接続」をシリアル化するための snse はほとんどありません。確かに接続文字列ですが、接続自体ですか?いや。同様に、アンマネージ ポインター/ハンドルを必要とするものは、適切にシリアル化されません。代議員もそうではありません。
さらに、 (デフォルトでは)XmlSerializer
およびDataContractSerializer
(デフォルトでは) はツリー シリアライザーであり、グラフ シリアライザーではありませんParent
。
シリアライザーの優先トークンでクラスをマークすることは、単に「意味があるはずです」と言う方法です。
IIRC と の両方は[XmlSerializer
、[DataContractSerializer]
、、またはのような要求に対して非常に厳格でしたが、最近はもう少しリベラルになりました。[Serializable]
[DataContract]
[IXmlSerializable]
現在、.Net Framework には 3 つの形式のシリアル化があります。
残念ながら、シリアル化には標準的な全体的なパターンがあります。3 つのフレームワークにはすべて、異なる要件と癖があります。