2011-10-31 2 views
2

회사와 제품 간의 일대 다 관계를 정의하는 다음 클래스 레이아웃이 있다고 가정 해 보겠습니다.XML 파일에 요소에 대한 참조를 저장하려면 어떻게해야합니까?

public class Company 
{ 
    public string Name { get; set; } 
    public string Address { get; set; } 
} 

public class Product 
{ 
    public Company Manufacturer { get; set; } 
    public string Name { get; set; } 
} 

XML로 직렬화하려고하지만 불행하게도 Product의 Company 인스턴스가 복제됩니다. 문서를 재주문 할 때, 복제 된 정보는 두 개의 별개의 인스턴스로 재결합됩니다.

회사 및 제품은 문서의 뒷부분에서 참조되므로이 관계를 변환 할 수 없습니다. 내가 필요한 것은 다음과 같은 문서를 생성하는 몇 가지 방법입니다.

<rootElement> 
    <companies> 
     <company> 
      <id>1</id> 
      <name>Apple</name> 
      <address>1 Infinite Loop... etc</address> 
     </company> 
     <company> 
      <id>2</id> 
      <name>Microsoft</name> 
      <address>1 Microsoft Way... etc</address> 
     </company> 
    </companies> 
    <products> 
     <product> 
      <companyId>1</companyId> 
      <name>iPhone</name> 
     </product> 
     <product> 
      <companyId>1</companyId> 
      <name>iMac</name> 
     </product> 
     <product> 
      <companyId>2</companyId> 
      <name>XBox 360</name> 
     </product> 
    </products> 
</rootElement> 

이러한 참조를 직접 다시 작성하기 위해 특정 컬렉션을 해킹 할 수 있다고 확신하지만 실제로 알고 싶습니다. 이 문제를 해결하는 "올바른"방법은 무엇입니까? Microsoft가이 문제를 생각하지 못했기 때문에이 문제를 해결하기 위해 .NET에서 사용할 수있는 뭔가가 있어야하지만 정확한 조건을 검색 할 수는없는 것 같습니다. .

+0

감사의 DataContractSerializer 내가 뭘 찾고있는 것과 똑같아. –

답변

0

똑바로 XML 직렬화를하고 아웃 바운드 직렬화에 대한 유일한 우려하는 경우, 당신은 제품의 제조업체 속성에 XMLIgnore 속성을 추가하고 직렬화에 대한 회사 ID 속성을 추가 할 수 있습니다

[XMLIgnore()] 
public Company Manufacturer { get; set; } 

public int companyId { 
    get { 
    return this.Manufacturer.id; 
    } 
    set { 
    // Ignore any updates, only present to support XML serialization 
    } 
} 
+0

나는 문서를 역 직렬화하고 재배 열할 필요가 있다고 특별히 말했 다. 그렇지 않으면 괜찮을 것이다. –

관련 문제