2008-11-06 30 views
0

我有以下的XML我想反序列化到一個類如何使用XmlSerializer類反序列化這個簡單的xml配置?

<?xml version="1.0" encoding="utf-8" ?> 
<root> 
    <element1>String1</element1> 
    <element2>String2</element2> 
</root> 

我想它序列化到下面的類:

[XmlRoot("root")] 
    public class root 
    { 
     [XmlElement("element1")] 
     internal string element1 { get; set; } 

     [XmlElement("element2")] 
     internal string element2 { get; set; } 
    } 

,當我嘗試使用下面的代碼是反序列化,配置對象被實例化,但字符串爲空。

 using (TextReader reader = new StreamReader(configFile)) 
     { 
      XmlSerializer serializer = new XmlSerializer(typeof(root)); 
      this.config = (root)serializer.Deserialize(reader); 
     } 

我使用XSD.EXE創建XSD,然後創建基於關閉的那類試過,但由該工具產生太多雜亂。我想我在這裏。我錯過了什麼?

回答

7

你不能序列化/反序列化內部屬性 - 它們必須是公開的。

5

我同意布羅迪關於你問題的性質。但是,您可能會反對公開這些字段。我過去處理這個問題的方式是創建一個可序列化的類,其唯一目的是讀/寫.xml並且公開其所有字段。然後創建一個新的類,這是外部接口。它將可序列化類作爲構造函數的參數,而外部類提供了控制對可序列化類的訪問的公共屬性。

1

爲了跟進我的實現......我最終放棄了將XmlSerializer類放在一起。我反序列化的類非常複雜,並且包含需要序列化的其他對象的列表。我必須添加到我的類的屬性的數量使

我最終使用Linq to XML來執行反序列化....類的複雜性降低了,但linq語句被支持成爲相當複雜。

如果我再次這樣做,我可能會考慮使用WCF和datacontract序列化器......這可能也很難做到。

我很好奇這些日子裏人們是如何將xml文檔反序列化爲對象的。在圍繞Linq發言後,我認爲這可能是一條路。對象創建起來更簡單,並且不需要公開。它看起來像XmlSerializer是「老派」,而Linq到XML更「新派」。我很想聽聽其他人不得不說的。

+0

嘗試使用XSD.exe – Brody 2008-11-13 01:23:23

1

您可以使用XSD.exe從XSD(XML模式定義)生成一個類。這產生了一個可用的類結構,可以對相關的XML進行序列化和反序列化。

相關問題