2016-05-01 32 views
-1

我正在製作一個C#應用程序,它需要將客戶數據序列化爲一個XML文件。C#將屬性從一個對象返回到XML

因此,我創建了以下類我想以後連載:

public class Customer { 
    private string name{get; set;} 
    private int age{get; set;} 

    public void setCustomerAge(){ 
     age = 20; 
    } 

    public void setCustomerName(string input){ 
     name = input; 
    } 

    public string customerName(){ 
     return name; 
    } 

    public int customerAge(){ 
     return age; 
    } 

} 

我已經試過的方法是創建一個新的客戶,設置它的屬性和調用SerializeObject()就可以了。

public void newCustomer(){ 
    Customer cust = new Customer(); 
    cust.setCustomerName("TEST"); 
    cust.setCustomerAge(); 
    SerializeObject(cust, savePath) 
} 

public void SerializeObject<T>(T serializableObject, string fileName) { 
    if(serializableObject == null) { 
     return; 
    } 

    try { 
     XmlDocument xmlDocument = new XmlDocument(); 
     XmlSerializer serializer = new XmlSerializer(serializableObject.GetType()); 
     using(MemoryStream stream = new MemoryStream()) { 
      serializer.Serialize(stream, serializableObject); 
      stream.Position = 0; 
      xmlDocument.Load(stream); 
      xmlDocument.Save(fileName); 
      stream.Close(); 
     } 

    } catch(Exception ex) { 
     Debug.WriteLine(ex); 
    } 
} 

文件生成,但輸出僅包含以下兩行:

<?xml version="1.0"?> 
<Customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /> 

我是不是從錯誤的方式接近這一點,我應該使用不同的總的方法?

+0

附註:我從來沒有見過任何人對創建Java風格存取像C#中的私人自動財產。您應該仔細閱讀一下屬性是什麼以及如何使用它們。 – Chris

+0

@Fruchtzwerg謝謝你的回答,但我希望保持這兩個變量私人porpuse。 – Eyire

+0

這非常好,但沒有必要讓它們成爲自動屬性{get;設置;}那樣。另外約定是在C#中使用PascalCasing而不是camelCasing! – Chris

回答

0

MSDN page for XmlSerializer.Serialize

序列化方法可轉換公共字段和讀取的對象/寫性能爲XML。它不會轉換方法,索引器,專用字段或只讀屬性。要序列化公共和私有對象的所有字段和屬性,請使用BinaryFormatter。

因此,您需要公共字段或公共非只讀屬性,其中沒有任何屬性。

我建議:

public class Customer 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

或者,如果你以後需要邏輯的制定者:

public class Customer 
{ 
    private string m_Name; 
    private int m_Age; 

    public string Name { get { return m_Name; } set { m_Name = value; } } 
    public int Age { get { return m_Age; } set { m_Age = value; } } 
} 
+0

坦克你的答案。我只是意識到我對xmlserializer一無所知。 – Eyire

+0

@Eyire然後檢查文檔的好時機! – Chris

0

你不能序列化這樣的私有屬性。一個方法來描述here。要解決您的問題,您必須將您的屬性設置爲公共(可選私人設置)。不再需要的

public string name { get; private set; } 
public int age { get; private set; } 

這樣一來,你的回報methodes像

public int customerAge(){ 
    return age; 
} 

。您在C#中獲取和設置屬性的方式並不常見(我認爲這是類似Java的)。看看here看看如何在C#中做到這一點。

+0

所以我不一定要將我的屬性設置爲私有,然後像這樣返回它們? – Eyire

+0

是的,在示例代碼中,您可以閱讀,但不能從外部更改值。 – Fruchtzwerg

0

從MSDN:

serialize方法轉換公共字段和讀/寫的對象的屬性 成XML。它不會轉換方法, 索引器,專用字段或只讀屬性

您沒有任何序列化,但對象本身。

相關問題