2011-02-02 4 views
5

구조체가 더 많거나 적게 있습니다.List <SomeStruct>()에서 각 목록 항목의 serialize 된 이름을 C#으로 재정의 할 수 있습니까?

[Serializable] 
[XmlRoot("Customer")] 
public struct TCustomer 
{ 
    string CustomerNo; 
    string Name; 
} 

가끔은이 구조체를 XML로 단일체로 직렬화하는데, 잘 작동하지만 때때로이 구조체의 List <>를 직렬화해야합니다.

최상위 요소 이름을 설정하는 데 사용했습니다. 그러나

[Serializable] 
[XmlRoot("Customers")] 
public class CustomerList : List<TCustomer> { } 

XmlSerializer는 각 목록 항목 TCustomer를 호출하려고합니다. TCustomer 대신 Customer라는 이름을 사용하도록 XmlSerializer에 어떻게 지시 할 수 있습니까?

답변

2

모든 해답을 제공해 주셔서 감사합니다. 그러나 구체적인 문제에 대한 해결책은 다음과 같이 간단합니다.

[XmlRoot("Customers")] 
public class Customers 
{ 
    [XmlElement("Customer")] 
    public List<TCustomer> List = new List<TCustomer>(); 
} 
+0

정확히 내가 무엇을 찾고 있었습니까! 고맙습니다! – Sergey

1

이 클래스/구조체 수준에서 결코 시도한 적이 있지만 클래스 내부의 목록을 serialize 할 때이 작업을 수행하는 방법입니다.

[XmlArray("ConfigurationList")] 
    [XmlArrayItem("Configuration")] 
    private List<string> pConfigList = new List<string>(); 
0

당신은 어떤 객체가 직렬화되는 방법 정의하기 위해 IXmlSerializable을 구현할 수 있습니다 어쨌든

IXmlSerializable Interface

을,이 중 실제의 형태이기 때문에 그 시리얼 항목의 TCustomer 유형을 호출하는 것 List (TCustomer은 ???, 여기서 ???는 제네릭 매개 변수 유형 TCustomer의 실제 유형입니다.)

IXmlSerializable을 구현하지 않고 개체를 serialize하는 방식을 변경하지 않습니다. (즉, 포스트 직렬화 텍스트 대체를 피하십시오.).

7

그것이 XmlRoot 속성은 루트 요소에 적용

[XmlType("Customer")] 
[XmlRoot("Customer")] 
public struct TCustomer 
{ 
    public string CustomerNo; 
    public string Name; 
} 
+0

Nice! 그래도 설명 할 수 있다면 좋을거야? –

+0

특성 대상을 XmlSerializer에서 serialize 할 때 생성되는 XML 스키마를 제어합니다. - http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmltypeattribute.aspx – Anuraj

+0

더 적절합니다 - XmlTypeAttribute 클래스의 새 인스턴스를 초기화하고 XML 형식의 이름을 지정합니다. - http://msdn.microsoft.com/en-us/library/573s2dsz.aspx – Anuraj

5

도움이되기를 바랍니다, 그래서 당신은 CustomerList를 직렬화하는 경우는 TCustomer 적용되지 않습니다.

독자적인 직렬화를 구현하지 않으면 TCustomerCustomerList 클래스 내에서 Customer으로 직렬화하도록 변경할 수 있다고 생각하지 않습니다. 그러나 당신은 제공해야합니다

[Serializable] 
[XmlRoot("customerList")] 
public class CustomerList 
{ 
    [XmlArray("customers")] 
    [XmlArrayItem("customer")] 
    public List<TCustomer> Customers { get; set; } 
} 

은 다음과 유사한 xml로 ...이 같은 작업을 수행 할 수 있습니다

<customerList> 
    <customers> 
     <customer /> 
     <customer /> 
     <customer /> 
    </customers> 
</customerList> 

이것은 일반적인 목록에서하여 customerList을 변경, 그러나 당신이 당신의 이름을 제어 할 수 있습니다.

+0

표준 유형에 대한 항목 이름을 일련 화하는 데 동의 한 대답을 아직 보지 못했습니다. 'List MyList'처럼,이 답변은 특정 케이스에서 자식 태그 이름의 이름을 다룰만큼 충분히 유연합니다. 또한 목록 요소 태그의 이름을 바꾸면 되겠지만 실제로 [[XmlArrayItem ("customer")]'만 필요하다는 것을 눈치 챘습니다. – Henrik

관련 문제