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 つのフレームワークにはすべて、異なる要件と癖があります。