シリアル化可能な属性.NET
-
27-09-2019 - |
質問
.NETでバイナリシリアル化を使用してオブジェクトをクローンしています。私自身のクラスのいずれかをマークしなければなりません <Serializable()>
属性シリアイザーがクラスを処理するために。しかし、これはあらゆるオブジェクトで使用される関数であるため、私は疑問に思っていました。
オブジェクトがマークされていなくても、オブジェクトをシリアナーにシリアル化することは可能ですか <Serializable()>
属性?そうでない場合、クラスへの属性を「自動適用」する方法はありますか?
編集。私の主な関心事は、.NETフレームワークに既に存在するPoCoオブジェクトをクローン化できる必要があることです。それらはすべてすでにシリアル化可能ですか?
解決
クラスがどのように実装されているかを知らずに、それをシリアル化することは安全ではなく、そうすることで微妙に壊れたオブジェクトにつながる可能性があります。そのため、クラスデザイナーは意図的に追加しなければなりません Serializable
属性、これが安全な操作であることをランタイムに知らせます。クラスにその属性を自動的に追加することは、おそらく悪い考えです。
あなたが本当にそうではないクラスをシリアル化する必要がある場合 Serializable
, 、手動で行うことができます:
- 問題のクラスを代替表現に往復する方法を見つけてください。
- 必要に応じて前後に変換するために、その他のクラスをシリアル化に使用します。
それに失敗すると、シリアル化以外に状態を保存する他の方法を見る必要があります。
他のヒント
ランタイムで属性を変更することはできません。ソースでのみ。
リフレクションを使用して、クラス/インスタンスのプロパティを繰り返すことができます。ただし、カスタムシリアナーを作成する必要があります。
.NETフレームワーク自体は通常、これが理にかなっているすべてのクラスと構造体でシリアル化サポートを提供するため、フレームワーク自体のクラスはクローニングで正常に機能する可能性があります。ただし、残念ながら適切なシリアル化サポートがないことが多いサードパーティライブラリを使用すると、トラブルに巻き込まれる場合があります。
typeof(yourtype).isserializableを使用することを検討してください...