BinaryFormatter
とします。それは依存します; -p
シリアライゼーションの目的は、複雑なメモリ内オブジェクトを、単純なバイトシーケンス(またはシリアライザ - 文字など)に応じて表現することです。オブジェクトを再作成します。
いくつかの型(プリミティブ、文字列など)は、シリアライザによって直接組み込みサポートされています。
クラスの場合には、(アセンブリなど名incuding)タイプのメタデータが書き込まれ、その後、すべてのタイプにフィールドのは、(プライベートなどを含む、本質的にType.GetFields()
)が挙げられます。すべてのフィールド([NonSerialized]
と表示されていない)については、フィールド名が書き込まれ、値は(同じプロセスを通じて)シリアル化されます。最終的には、組み込みのプリミティブ、いくつかの型定義、およびいくつかの名前/値フィールドの組み合わせに至るまですべてが沸騰します。
ここでの例外は、型がISerializable
を実装している場合です。この場合、型は出力自体を直列化するように求められます。これは、辞書型のようなものでは一般的です。型のメモリ内レイアウトはストリームとは異なって表現できます。
デシリアライズ中は、プロセスは逆になります。特殊な直列化コンストラクタ/ ISerializable
を持たない限り、型メタデータを使用して空のオブジェクトを作成します。フィールドはストリーム内で見つかったときに設定されます。
シリアライズとデシリアライズの両方で、(デ)シリアライゼーション用のオブジェクトを修正するための追加コードを実行できる「コールバック」ポイントがあります。
このプロセスは脆弱です。多くの理由で、see here - しかし、それはまた、バージョンが許されておらず、実装固有です(あなたはjavaなどからそれを消費することはできません)。
protobuf-netは契約ベース、というよりもフィールドベースあるバイナリシリアライザであることによって、これらの問題の多くを解決します。
フィールド自体またはそれに割り当てられた値ですか? –
フィールドまたはそれに割り当てられた値またはその両方ですか? –
xmlシリアル化では、パブリックフィールド+プロパティにread *および* writeアクセサーの両方を指定します。 [XmlIgnore]とマークされていないもの。または 'IXmlSerializable'が最初のdibsを持っています;-p –