2011-12-17 2 views
0

XML 직렬화에 대한 질문이 하나 더 있습니다. 나는 Base 클래스가, 나는 그것에서 상속 Derived1Derived2 클래스가 있습니다. 나는 XML 요소 <base>에서 그들을 직렬화하는 나는 Derived1 인스턴스를 생성 할 <base attr="1"> 또는 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

관련 문제