7

フォーム上のメタデータのプレースホルダーとして設計された非ビジュアル コンポーネントを 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 ではないことを報告します。

この問題は単純な質問を超えていると思います。ということで、近日中に閉めさせていただきます。
誰かが似たようなものへのリンクを持っていれば、それは大いに役立ちます。

4

3 に答える 3

3

すべてを生成されたコードとしてシリアル化する別の方法を試してみることをお勧めします。それを行うのはとても簡単です。Componentから非ビジュアル クラスを実装するだけです。次に、コレクションを公開しますが、コレクションに配置された各オブジェクト自体がComponentから派生していることを確認してください。そうすることで、すべてがコード生成されます。

于 2008-10-01T01:44:34.307 に答える
3

それ以来、どこが間違っていたのかを発見しました。

カスタム コレクション (CollectionBase から継承) を実装していたコンポーネントを List に変更し、DesignerSerializationVisibility(DesignerSerializationVisibility.Content) 属性を List プロパティに追加しました。このリストも読み取り専用です。これにより、リスト内のすべてのコンポーネント プロパティとすべてのエントリを生成するコードが生成されます。

リストに格納されたクラスは、特定の属性を必要とせず、シリアル化する必要もありませんでした。

private List<Rule> _Rules;
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public List<Rule> Rules
{
    get { return _Rules; }
}
于 2008-10-13T22:42:49.527 に答える
2

シリアル化の問題が発生しているクラスのコードをさらに追加してください。おそらく、コンストラクターと、使用している変数への参照を提供するプロパティです。

注:ビジュアルデザイナーとコード生成で多くの問題が発生しました。コントロールにプロパティがある場合は、通常、

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

プロパティで初期化を自分で処理します。

于 2008-10-02T01:00:53.043 に答える