フォーム上のメタデータのプレースホルダーとして設計された非ビジュアル コンポーネントを C# で作成しました。
コンポーネントには、カスタム オブジェクトのコレクションであるプロパティがあり、このオブジェクトは Serializable としてマークされており、シリアライズ用の GetObjectData とデシリアライズ用のパブリック コンストラクタを実装しています。
フォームの resx ファイルでは、コレクションを格納するためのバイナリ データが生成されますが、シリアル化されたクラスに変更を加えるたびにデザイナー エラーが発生し、resx ファイルからデータを手動で削除してから、このデータを再作成する必要があります。
クラス内の各プロパティの周りに try / catch ブロックを持つようにコンストラクターを変更しようとしました
try
{
_Name = info.GetString("Name");
}
catch (SerializationException)
{
this._Name = string.Empty;
}
しかし、それでもクラッシュします。最後のエラーは、IConvertible を実装する必要があるというものでした。
少なくともそれを見ることができるので、xml シリアライゼーションを使用したいと思いますが、デザイナーがこれを使用することは可能ですか?
シリアル化をより安定させ、変更に対する耐性を低くする方法はありますか?
編集:
詳細...より良い説明おそらく
、コンポーネントから継承するクラスがあり、ルールのコレクションである1つのプロパティがあります。RulesCollection は Serializable としてマークする必要があるようです。そうしないと、メンバーが保持されません。
Rules クラスは、コンポーネント トレイに表示されないようにする属性 DesignTimeVisible(false) を持つコンポーネントでもあります。このクラスは Serializable とマークされていません。
コレクションを Serializable としてマークすると、resx ファイルにバイナリ データが生成され (理想的ではありません)、IDE は Rules クラスが Serializable ではないことを報告します。
この問題は単純な質問を超えていると思います。ということで、近日中に閉めさせていただきます。
誰かが似たようなものへのリンクを持っていれば、それは大いに役立ちます。