2011-08-16 5 views
1

나는 다음과 같은 정의 된 클래스, 직렬화하려고 :클래스는 클래스 이름없이 XML로 직렬화

 [DataContract] 
    public class Human 
    { 

     public Human() { } 


     public Human(int id, string Name, bool isEducated) 
     { 
      this.id = id; 
      this.Name = Name; 
      this.isEducated = isEducated; 
     } 

     [DataMember] 
     public int id { get; set; } 

     [DataMember] 
     public string Name { get; set; } 

     [DataMember] 
     public bool isEducated { get; set; } 
    } 
그 다음이 연재되고있는 것

:

  Human h = new Human(id, Name, isEducated); 
     XmlRootAttribute root = new XmlRootAttribute(); 
     root.ElementName = "Repository"; 
     XmlSerializer xs = new XmlSerializer(typeof(Human), root); 

     FileStream fs = new FileStream(fname, FileMode.Open); 
     xs.Serialize(fs, h); 

을 그리고 이것은 결과입니다 :

<Repository xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <id>1</id> 
    <Name>Vill</Name> 
    <isEducated>false</isEducated> 
</Repository> 

내가 원하는 것은 아닙니다. 클래스 이름은 그냥 생략됩니다. 여기에 어떤 문제가 있습니까?

+0

는 "루트"물건없이 그것을 시도 나는 아래에 당신을 위해 일 수있는 무언가의 예를 가지고있다. –

답변

3

"Repository"라는 루트 요소의 이름을 명시 적으로 지정했기 때문에 이러한 방식으로 표시됩니다. 그 문장을 생략 해보십시오 :)

나는이 저장소 요소 뒤에 Human이 있어야한다고 생각합니다. 그렇게하려면 저장소 아래에 다른 루트 요소를 만들고 그 개체를 직렬화해야합니다. XmlSerializer는 일반적으로 XML 파일에 개체를 쓰는 데 사용되며 실제로 전체 XML 파일을 만들지는 않습니다. 그런

System.Xml.XmlTextWriter writer = new System.Xml.XmlTextWriter(FilePath, null); 
writer.WriteStartDocument(); 
writer.Formatting = Formatting.Indented; 
writer.WriteStartElement("Repository"); 

Human h = new Human(id, Name, isEducated); 
XmlRootAttribute root = new XmlRootAttribute(); 
root.ElementName = "Human"; 
XmlSerializer xs = new XmlSerializer(typeof(Human), root); 
xs.Serialize(writer, h); 

writer.WriteEndElement(); 
writer.Close(); 

뭔가 ... 정말 졸려 :/

+0

음, 서브 루트 구성 요소를 명시 적으로 지정하려면 어떻게해야할까요? – Arnthor

+0

예, 답을 수정하겠습니다. 대기. –

+0

@ Nordvind 방금 내가 쓴 것을 간단하게 편집했습니다. –

관련 문제