차이
case 1
1 2 3 4 5 6 7 8 |
public class Retrieve { public Air[] Air { get; set; } public Info Info { get; set; } } |
case 2
1 2 3 4 5 6 7 8 9 10 |
public class Retrieve { [XmlElement("Air")] // 컨테이너 제거하고 요소 직접 반복 public Air[] Air { get; set; } [XmlElement("Info")] public Info Info { get; set; } } |
직열화 case1
1 2 3 4 5 6 7 8 9 |
<Retrieve> <Air> <!-- 배열 속성 이름 --> <Air>…</Air> <!-- 배열 원소의 이름 --> <Air>…</Air> </Air> <Info>…</Info> </Retrieve> |
직열화 case2
1 2 3 4 5 6 7 8 9 |
<Retrieve> <Air>…</Air> <!-- 배열 원소의 이름 --> <Air>…</Air> <Info>…</Info> </Retrieve> |
배열 속성 위에 [XmlElement]
특성을 붙이면,
컨테이너 없이 바로 <Air> 요소들만 나열됩니다.
[XmlArray] / [XmlArrayItem]와의 차이
컨테이너를 원한다면:
1 2 3 4 5 6 7 8 |
public class Retrieve { [XmlArray("Air")] // 컨테이너 이름 지정 [XmlArrayItem("Air")] // 아이템 이름 지정 public Air[] Air { get; set; } } |
1 2 3 4 5 6 7 8 9 |
<Retrieve> <Air> <!-- 배열 속성 이름 --> <Air>…</Air> <!-- 배열 원소의 이름 --> <Air>…</Air> </Air> <Info>…</Info> </Retrieve> |
스키마가 반복을 직접 요구 → [XmlElement(“Air”)]
스키마가 컨테이너 아래 반복을 요구 → [XmlArray] + [XmlArrayItem(“Air”)]
자주 하는 실수 & 팁
빈 배열/리스트일 때 출력
[XmlElement(“Air”)]: 요소가 0개면 아무것도 출력되지 않음 (컨테이너가 없으니까).
[XmlArray]: 빈 컨테이너 가 출력될 수 있음 (리스트가 empty일 때).
특정 스키마가 “빈 컨테이너라도 꼭 있어야 함”을 요구한다면 XmlArray를 쓰는 게 낫습니다.
순서 제어
XmlSerializer는 보통 선언 순서대로 요소를 출력합니다.
필요하면 [XmlElement(Order = n)] 를 형제 속성들에 부여해 정확한 순서를 맞출 수 있습니다.
1 2 3 4 5 6 7 8 9 10 |
public class PNRBFRetrieve { [XmlElement(Order = 1)] public Info Info { get; set; } [XmlElement("Air", Order = 2)] public Air[] Air { get; set; } } |
네임스페이스 지정
요소에 네임스페이스를 강제하려면 [XmlElement(“Air”, Namespace=”…”)] 처럼 지정하세요.
루트/타입 수준 네임스페이스는 [XmlRoot(Namespace=”…”)], [XmlType(Namespace=”…”)] 등으로 지정.
List vs 배열
List도 동일하게 동작합니다. 빈/가변 컬렉션 관리가 쉬워 실무에서는 List를 선호합니다.
예:
1 2 3 4 |
[XmlElement("Air")] public List<Air> Air { get; set; } = new(); |
아이템 이름 커스터마이즈
[XmlElement(“ItemName”)]의 “ItemName”은 각 아이템 요소의 태그명입니다.
속성명이 Air여도 아이템명을 Air로 유지하려면:
1 2 3 4 |
[XmlElement("Air")] public Air[] Air { get; set; } |