9

XMLSerializer を使用して、このクラスをファイルに保存しています。以下に示すように、クラスには文字列と列挙型があります。

public class IOPoint
{
     string Name {get; set;}
     TypeEnum {get; set;}
}


public enum TypeEnum
{
    Temperature,
    Pressure,
    Humidity,
}

シリアライズするとこんな感じ。

<IOPoint>
  <Name>Relative Humidity</Name>
  <TypeEnum>Humidity</TypeEnum>
</IOPoint>

このオブジェクトをいくつかのバージョンで問題なくシリアライズおよびデシリアライズしてきました。Humidity をサポートする必要がなくなったため、enum から削除しました。ただし、TypeEnum フィールドの値 Humidity が TypeEnum の有効な値ではないため、XML から逆シリアル化するときに例外が発生します。これは理にかなっていますが、これをどのように処理しますか?

私がやりたいことは、このエラーを無視することです。値を null のままにします。OnUnknownElement XmlDeserilizationEvent クラスを実装してみました。残念ながら、これはこのエラーをキャッチしません。

このエラーをキャッチして無視する方法についてのアイデア (逆シリアル化が完了した後にクリーンアップできます)。

ミッチ

4

4 に答える 4

5

メンバーに廃止のマークを付けることができます

public enum TypeEnum
{
    Temperature,
    Pressure,
    [Obsolete]
    Humidity
}
于 2012-05-22T18:56:29.790 に答える
4

ライブラリが既に使用されている後に列挙メンバーを削除することは、一般的に悪い習慣と見なされています。メンバーを所定の位置に残しておいて、[Obsolete]将来の使用を防ぐために属性でマークするのはなぜですか? ObsoleteAttribute(string,bool)コンストラクターの 2 番目のパラメーターを として指定するtrueと、マークされたメンバーにアクセスした場合にコンパイル エラーが発生します。

public enum TypeEnum
{
    Temperature,
    Pressure,

    [Obsolete("It's always sunny in Philadelphia", true)]
    Humidity,
}

逆シリアル化された値をチェックするときのエラーを回避するには、基になる値と比較できます: typeEnum == (TypeEnum)2.

于 2012-05-22T19:01:20.937 に答える
2

属性を使用してノード名を変更したり、xml シリアル化から要素を非表示にしたりして、その 1 つの要素だけを手動で解析できます。

public class IOPoint
{
 public string Name {get; set;}

 [XmlIgnore]
 public TypeEnum TypeEnum {get; set;}

 [XmlElement("TypeEnum")]
 public string LegacyTypeEnum 
 {
  get { return this.TypeEnum.ToString(); }
  set 
  { 
   try
   {
    this.TypeEnum = (TypeEnum)Enum.Parse(typeof(TypeEnum),value);
   }
   catch(ArgumentException)
   {
    // Handle "Humidity"
   }
   catch(OverflowException)
   {
   }
  }
 }
}

コメントごとに、多少の混乱があるようです。これは、Visual Studio 2010 プロジェクトとして動作する例です。このアプローチは、オブジェクトの 1 つのプロパティのみを手動で解析する簡単な方法です (引き続き XmlSerializer を利用して XML 解析を行います)。

于 2012-05-22T19:45:11.050 に答える
1

列挙型に TryParse のようなものを使用できるIXmlSerializableを実装できます。

しかし、Obsolete 属性を使用している他の投稿者には同意します。

于 2012-05-22T19:04:00.383 に答える