2011-03-30 4 views
2

내가 XML로 다음 클래스를 직렬화하는 방법을 알아 내려고 노력하고있어 (특정 방법으로, 아래 참조) :XmlRoot에 개체 컬렉션을 갖게하려면 어떻게합니까?

[XmlRoot("Farm")] 
public class Farm 
{ 
    [XmlArray] 
    [XmlArrayItem("Person", typeof(Person))] 
    [XmlArrayItem("Dog", typeof(Dog))] 
    public List<Animal> Animals { get; set; } 
} 

(DogPerson 모두 Animal에서 파생한다고 가정하고, 둘 [XmlAttribute("Name")]로 장식 된 Name 속성이) 나는이 개체를 만들 수 있어야합니다

:.

,691을 이런 내가 myFarm (콘솔로 결과 출력) 직렬화

<?xml version="1.0"?> 
<Farm> 
    <Person Name="Bob"/> 
    <Dog Name="Fido"/> 
</Farm> 

그러나 :

var myFarm = new Farm 
{ 
    Animals = new List<Animal> { 
     new Person { Name = "Bob" }, 
     new Dog { Name = "Fido" } 
    } 
}; 

... 그것은 다음과 같은 문서를 직렬화가

var serializer = new XmlSerializer(typeof(Farm)); 
var namespaces = new XmlSerializerNamespaces(); 
namespaces.Add("", ""); 
serializer.Serialize(System.Console.Out, myFarm, namespaces); 

결과는 다음과 같습니다.

<?xml version="1.0"?> 
<Farm> 
    <Animals> 
     <Person Name="Bob"/> 
     <Dog Name="Fido"/> 
    </Animals> 
</Farm> 

여분의 동물 요소에 유의하십시오. 이걸 어떻게 없앨까요? XML 스키마 변경은 옵션이 아니지만 코드를 변경하면됩니다. 나는이 문제를 해결할 수 있기를 정말로 바랄 뿐이다. 누군가가 쉬운 수정을 안다면 (또는 쉬운 수정이 없다는 사실을 안다).

감사합니다.

답변

2

대신 다음과 같은 속성을 사용하여 마법처럼

[XmlRoot("Farm")] 
public class Farm 
{ 
    [XmlElement("Person", typeof(Person))] 
    [XmlElement("Dog", typeof(Dog))] 
    public List<Animal> Items { get; set; } 
} 
+0

작품을, 감사합니다! –

관련 문제