2011-12-17 16 views
0

XMLシリアル化に関するもう1つの質問。私はBaseクラスを持っており、Derived1Derived2のクラスが継承されています。私はXML要素<base>からそれらを逆直列化したいと考えています。Derived1インスタンスをまたはDerived2インスタンスの場合は<base attr="2">に作成します。どうしたらいいですか?私はXmlSerializesXmlAttributeOverridesを使用しています。ありがとうございますXMLシリアル化:属性値に応じて派生クラスをインスタンス化

+0

私の答えはあなたのために機能しますか? –

答えて

0

編集:私はあなたの正確な状況に合わせて私の答えを完全に改訂しました。既にあなたのベースリストを正しくシリアル化していると仮定すると、以下のコードが有効になります。

通常、スイッチステートメントはOCPに違反するため、推奨しません。通常、多型がより良い答えです。しかし、迅速かつ汚れた解決法、および(あなたの場合のように)比較的少ない値を持つswitch文については、これはうまくいくでしょう。

重要事項:XMLシリアライザは、適切にシリアル化されていると仮定して、適切な派生クラスにデシリアライズします。しかし、何らかの理由でそれがあなたの状況に当てはまらない場合は、残りのコードが必要になります(switch文のforeach)。

private static void ImportDerivedClasses() 
{ 
    List<Base> bases; 
    string filePathAndName = @"c:\temp\SerializedBases.xml"; 

    using (FileStream fileStream = new FileStream(filePathAndName, FileMode.Open)) 
    { 
     XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Base>)); 
     bases = xmlSerializer.Deserialize(fileStream) as List<Base>; 
    } 

    // The rest of this is unnecessary if we originally serialized correctly. 

    List<Base> deserializedBases = new List<Base>(); 

    foreach(Base baseClass in bases) 
    { 
     switch (baseClass.Attr) 
     { 
      case "1": 
       deserializedBases.Add(new Derived1()); 
       break; 
      case "2": 
       deserializedBases.Add(new Derived2()); 
       break; 
      default: 
       // Log warning 
       break; 
     } 
    } 
} 
+0

うわー、FxCopを抑制するときに使用するメッセージに!あなたは、あなたの特定のプロジェクトについて本当に知りません人のためにそれをカットすることができますか? – sq33G

関連する問題