2011-12-14 2 views
0

개체를 serialize 할 때 XML 루트 요소 또는 "래퍼"를 XmlSerializer에 추가 할 수 있습니까?XmlSerializer 기본 XmlRoot로 serialize

<Groups> 
    <Group method="ModifySubGroups" ID="1234" PIN="5678"> 
     <SubGroup action="Delete" number="95"> 
      <Name>Test</Name> 
     </SubGroup> 
    </Group> 
</Groups> 

내가 두 개의 클래스, 그룹 및 하위 그룹이 있습니다

내가 찾고 오전 XML은 다음과 같이 될 것이다. 그룹에는 하위 그룹의 일반 목록이 포함됩니다. 그것은 훌륭하게 작동하지만 XML Root "Groups"가 없습니다. 두 클래스 그룹을 사용하고 하위 그룹이 생산 : 나는 일에 그것을 얻을 수

<Group method="ModifySubGroups" ID="1234" PIN="5678"> 
    <SubGroup action="Delete" number="95"> 
     <Name>Test</Name> 
    </SubGroup> 
</Group> 

유일한 방법은 그룹을 포함 다른 클래스 "그룹"을 만드는 것이 었습니다. 이제 그룹, 그룹 및 하위 그룹의 세 가지 클래스가 있습니다. 그룹에는 그룹이 있고 그룹에는 그룹이 있습니다.

다른 아이디어?

답변

4

일반적으로 XML을 사용하기 위해 XML 직렬화를 사용하지 않습니다. 루트 컨테이너 요소가 필요하면 루트 컨테이너 객체가 있어야하고 Group 객체 대신 직렬화해야합니다.

당신은 그러나 Group 객체

void Main() 
{ 
    var g = new Group(); 
    g.SubGroups.Add(new SubGroup {Name = "aaa"}); 

    var ser = new XmlSerializer(typeof(Group[]), new XmlRootAttribute("Groups")); 
    using (var w = new StringWriter()) 
    { 
     ser.Serialize(w, new Group[] {g}); 
     w.ToString().Dump(); 
    } 
} 

public class Group 
{ 
    [XmlElement("SubGroup")] 
    public List<SubGroup> SubGroups = new List<SubGroup>(); 
} 

public class SubGroup 
{ 
    public string Name; 
} 

을의 배열을 직렬화 할 수

는 당연히이 직렬화 코드 중 하나 마법 항상 오직 하나의 그룹 요소가 있다는 것을 알고 있거나있을 수 있다고 가정 할 필요가 있다는 것을 의미 0 이상 . 솔직히 그룹 컬렉션을 순차적으로 serialize하지 않는 한,이 작업을 수행하는 데별로주의하지 않습니다. 그것은 혼란을 더할뿐입니다.

+0

나는 이것에 대해 아무런 통제력이 없다. 웹 서비스를 제공하는 공급 업체는이 방법이 필요합니다. 그리고 이것은 잘 작동합니다. 감사! – vincentw56

+0

@ vincentw56 기존 스키마의 경우 내 편집 된 답변보기를 준수해야합니다. – vittore

+0

참고 : 가능한 메모리 누수! http://msdn.microsoft.co.kr/ru-ru/magazine/cc163491.aspx – Evgeny

0

EDIT : 실제로 공급 업체 스키마를 준수하려면 잘못된 지점에서 시작해야합니다. 이렇게 클래스를 구현할 필요는 없습니다. 대신 공급 업체 XSD를 사용하고 Visual Studio에서 제공하는 xsd utility을 사용하여 스키마에서 .net 클래스를 생성하고, 객체를 직렬화 할 방법을 선택할 수 있습니다. (당신에게 내가 말을 더 나은 유연성을 제공합니다) XmlSerializer 또는 DataContractSerializer

참고 :이없는 및

스스로를 작성하는 방법을 모른다면 당신은 당신의 XML에서 XSD를 생성하는 몇 가지 도구를 사용할 수 있습니다 사용자 지정 XML 루트를 지정하기 위해 XmlRootAttribute을 사용할 수 있습니다.

또한 직렬화 할 때 컬렉션을 지정하면 래퍼를 지정할 수 있습니다. - Array Serializing

+0

XmlSerializer의 생성자에서이를 수행하면 "그룹"이 "그룹"으로 바뀝니다. 루트 요소 또는 "래퍼"를 추가하지 않습니다. – vincentw56

+0

'XmlArray'와'XmlArrayItem'은 루트 요소에서 작동하지 않습니다. –

+0

데이터 계약은 XML 속성을 지원하지 않기 때문에이 경우 작동하지 않습니다. –

관련 문제