C#のXMLSerializerでシリアル化属性を使用しないのはなぜですか。
http://msdn.microsoft.com/en-us/library/71s92ee1.aspx
ここでは、OrderedItemクラスはシリアル化されていません。理由は何ですか?
C#のXMLSerializerでシリアル化属性を使用しないのはなぜですか。
http://msdn.microsoft.com/en-us/library/71s92ee1.aspx
ここでは、OrderedItemクラスはシリアル化されていません。理由は何ですか?
OrderedItem
非常にシリアル化されています...「なぜ[Serializable]
属性がないのですか?」という意味だと思います。もしそうなら、答えは単純です:シリアライザーはそれを要求しません。それはetcによって要求されBinaryFormatter
ますが、彼らは少し異なることをしています-彼らはオブジェクトの内部状態をシリアル化しています。ただし、最近のほとんどのシリアライザーはそれをチェックしません。例:
XmlSerializer
DataContractSerializer
(およびすべてのバリアント)JavascriptSerializer
基本的に、それは必要ではありません。おそらく重要な違いは、誤って(属性なしで)リモートBinaryFormatter
境界を越えて不適切なデータを送信してしまい、大きな問題を引き起こす可能性があることです。
[Serializable]
多くの「軽い」フレームワークは定義さえしていません。
BinaryFormatterは[Serializable]属性を使用します。ただし、XMLSerializerはこれを必要としません。セラライザーを作成することによって
XmlSerializer serializer =
new XmlSerializer(typeof(OrderedItem));
彼は、OrderedItemが実際にSerializableであると想定しています。
私が見つけた説明は、たとえば、クラスをとしてマーク[Serializable]
し、そのオブジェクトをシリアル化するとBinaryFormatter
、そのクラスのインスタンスのプライベートメンバーもシリアル化されるため、そのクラスをシリアル化する必要があるかどうかを判断できるメカニズムです。全体として、またはXmlまたはJSシリアライザーを使用してシリアル化し、パブリックメンバーのみを取得します。
したがって、XmlSerializerを使用してシリアル化すると、パブリックメンバーのみがシリアル化されます。