2013-11-15 2 views
5

C#에서는 개체 목록이있는 개체를 직렬화하면 목록도 serialize됩니까?C# 개체 목록에있는 개체를 serialize

public class Move { 
    public string MoveName {get; set;} 

    public List<Tag> oTags = new List<Tag>; 
} 

public class Tag { 
    public string TagName {get; set;} 
} 

나는 움직임은 이동에 저장된 모든 태그뿐만 아니라 직렬화 얻을 것이다 직렬화하면? 또한 목록을 serialize하지 않으면 어떻게 할 것인가?

<Move> 
    <MoveName>name</MoveName> 
    <Tag>Value</Tag> 
    ... 
</Move> 
+0

현재 응답에 관계없이 _how_ 직렬화하고 있습니까? 예를 들어,'XmlSerializer'를 사용하면 작동 할 것입니다. (특정 XML 스키마 출력을 얻으려면 특수한 속성이나 독창성을 사용해야 할 수도 있지만) –

+0

XmlSerializer를 사용하고 있습니다 –

+1

어떻게 스키마를 원합니까? 많은 태그를 다루는 방법이 다소 모호한 것 같습니다. ' 이름 값 1 값 2 ...이어야합니다. 값 N'? 또한,'Move' 클래스와'Tag' 클래스를 변경하면 유연합니까? –

답변

9

예, 사용 t에서이 코드

XmlSerializer serializer = new XmlSerializer(typeof(YourClass)); 

을 시도해야한다 그는 XmlSerializerT (또는 귀하의 경우 Tag)이 직렬화 될 수있는 한 List<T>을 직렬화합니다.

Move move = new Move { MoveName = "MyName" }; 
move.oTags.Add(new Tag { TagName = "Value1" }); 
move.oTags.Add(new Tag { TagName = "Value2" }); 
move.oTags.Add(new Tag { TagName = "Value3" }); 

StringBuilder output = new StringBuilder(); 
var writer = new StringWriter(output); 

XmlSerializer serializer = new XmlSerializer(typeof(Move)); 
serializer.Serialize(writer, move); 

Console.WriteLine(output.ToString()); 

이 같이 현재 클래스 구조를 사용하여 출력합니다

<?xml version="1.0" encoding="utf-16"?> 
<Move xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <oTags> 
    <Tag> 
     <TagName>Value1</TagName> 
    </Tag> 
    <Tag> 
     <TagName>Value2</TagName> 
    </Tag> 
    <Tag> 
     <TagName>Value3</TagName> 
    </Tag> 
    </oTags> 
    <MoveName>MyName</MoveName> 
</Move> 

내가 현재 XML 스키마와 일치 할 수있는 방법을 찾을 수 있다면 내가 볼 수 있습니다,하지만 당신은 XmlAttributes을 적용하는 방법을 찾아 볼 수 있습니다 직접 놀아 라.


편집 : 다음 XmlAttributes를 사용하도록 클래스 선언을 변경하는 경우

, 당신이 당신의 예에서와 같이 정확한 XML 스키마를 달성 :

public class Move 
{ 
    [XmlElement(Order = 1)] 
    public string MoveName {get; set;} 

    [XmlElement(Order = 2, ElementName = "Tags")] 
    public List<Tag> oTags = new List<Tag>(); 
} 

public class Tag 
{ 
    [XmlText] 
    public string TagName {get; set;} 
} 

어떤 직렬화 생산시기 :

<?xml version="1.0" encoding="utf-16"?> 
<Move xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <MoveName>MyName</MoveName> 
    <Tags>Value1</Tags> 
    <Tags>Value2</Tags> 
    <Tags>Value3</Tags> 
</Move> 
+0

그것이 내가 현자를 찾고있는 대상과 일치하지 않지만 내 개체의 목록을 통해 파싱 할 것인지 여부에 대한 내 질문에 응답합니다. . 브렌든 힐 (Brendan Hill)의 글은 내가 원하는 레이아웃을 위해 그것을 설정하는 방법을 잘 알려줍니다. 고맙습니다. –

+0

@maxinfet : 내 편집/업데이트를 확인합니다. 스키마와 일치하는 출력을 생성하는 속성 집합을 발견했습니다. –

+0

@maxinfet : 또한 필자는 serialization 코드를 약간 손상 시켰으므로 이미 복사/붙여 넣기를했다면 다시 검사 할 수 있습니다. –

1

기본적으로 목록에있는 항목은 직렬화 할 수 없으므로 그렇지 않습니다.

이러한 경우, 다음 다음 페이지의 userful 찾을 수 있습니다 : 당신이 당신의 클래스 선언이 질문에 잘 있는지 확인

XML Serialize generic list of serializable objects

3

인가를? 그냥 Public Move를 선언하는 , 그것은 Public class Move

귀하의 경우

Move m = new Move(); 
      m.oTags.Add(new Tag() { TagName = "X" }); 
      m.oTags.Add(new Tag() { TagName = "XX" }); 

      XmlSerializer x = new XmlSerializer(typeof(Move)); 
      System.IO.Stream s; 

      var xmlwriter = System.Xml.XmlWriter.Create("C:\\MXL.txt"); 
      x.Serialize(xmlwriter, m); 

출력

<?xml version="1.0" encoding="utf-8"?> 
    <Move xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <oTags> 
<Tag> 
    <TagName>X</TagName> 
</Tag> 
<Tag> 
    <TagName>XX</TagName> 
</Tag> 
</oTags></Move> 
관련 문제