2012-09-30 3 views
2

다른 사용자 정의 클래스를 포함하는 XML로 객체를 직렬화하려고합니다. 내가 이해하는 (나는 MSDN을 읽고 대부분)이므로, XmlSerializer은 이것을 고려하지 않습니다.사용자 정의 클래스를 포함하는 클래스를 직렬화

XML 직렬화는 XML 스트림으로 만 대중 필드와 객체의 속성 값을 직렬화 :

나를 혼란 라인입니다. XML 직렬화는 형식 정보를 포함하지 않습니다. 예를 들어 Library 네임 스페이스에 Book 개체가있는 경우이 개체를 같은 유형의 개체로 deserialize 할 수는 없습니다. MSDN에서 촬영

, here

예를 들어, I 형 Order의 객체를 직렬화하기를 원하지만 그것은 Products의 목록을 포함하고, 각각의 유형 Category의 객체가 포함

class Order 
{ 
    List<Product> products; 
} 

class Product 
{ 
    Category type; 
} 

class Category 
{ 
    string name; 
    string description; 
} 

<Order> 
    <Product> 
     <Category Name=""> 
      <Description></Description> 
     </Category> 
    </Product> 
    <Product> 
     <Category Name=""> 
      <Description></Description> 
     </Category> 
    </Product> 
<Order> 
012 :

는 그리고 내 Order 오브젝트과 같이 직렬화 할

XmlSerializer이 이미이 작업을 수행합니까? 그렇지 않다면 직렬화 프로세스를 스스로 정의해야하는 또 다른 클래스가 있습니까?

+2

괜찮을 것입니다. public getters/setter를 사용하여 private 필드를 public 속성으로 다시 선언하십시오. 'XmlAttribute' 속성 (그리고 다른 것들)을 사용하여 속성이 원하는 스타일로 직렬화되도록 할 수 있습니다. 편집 : 당신은 또한'공개'클래스를 만들어야 할 수도 있습니다; '내부'가 작동하는지 여부는 확실하지 않습니다. –

답변

1

주문은 여러 제품 범주에 속할 수 있으므로 제품 목록, 제품 범주 목록으로 볼 수 있습니다.

당신은 변수가 그런 식으로 명명되기 때문에 <Products><Categories> (복수) 태그, 볼 수 있다는

//... 
using System.Xml; 
using System.Xml.Serialization; 
//... 

[XmlRoot("Order")] 
public class Order 
{ 
    [XmlArrayItem(ElementName = "Product", Type = typeof(Product))] 
    public List<Product> Products; 
} 

public class Product 
{ 
    [XmlArrayItem(ElementName = "Category", Type = typeof(Category))] 
    public List<Category> Categories; 
} 

public class Category 
{ 
    [XmlAttribute("Name")] 
    public string name; 

    [XmlElement("Description")] 
    public string description; 
} 

유일한 트레이드 오프가 사용하려고 노력하지만,의 관점에서 수행 할 수 있습니다 XML을 나중에 구문 분석하면 문제가되지 않습니다. 원하지 않는 다른 필드가 XML에 나타나면 [XmlIgnore()] 앞에 입력하면됩니다.

관련 문제