2011-08-16 6 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

ルート要素「リポジトリ」の名前を明示的に指定しているため、そのように表示されています。その文を省略してみてください:)

私はあなたが望むものは、このリポジトリ要素の後に人間を持つことだと思います。これを行うには、リポジトリの下に別のルート要素を作成し、オブジェクトをそれにシリアル化する必要があります。 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私は簡単に書いた内容を編集しました。 –

関連する問題