C#将Object中的属性返回给XML

时间:2016-05-01 17:22:33

标签: 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" />

我是从错误的方式接近这个,我应该使用完全不同的方法吗?

4 个答案:

答案 0 :(得分:0)

您无法像这样序列化私有属性。描述here描述了一种方法。要解决您的问题,您必须将属性设置为public(可选的私有集)。

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

这样,您的返回方法就像

public int customerAge(){
     return age;
 }
不再需要

了。在C#中,获取和设置属性的方式并不常见(我认为这类似于Java)。查看here以了解如何在C#中执行此操作。

答案 1 :(得分:0)

来自MSDN:

  

Serialize方法转换公共字段和读/写   对象的属性为XML。它没有转换方法,   索引器,私有字段或只读属性

你没有什么可以序列化但是对象本身。

答案 2 :(得分:0)

Xml.Serialization.XmlSerializer对象仅执行浅序列化。如果还要序列化对象或子对象的私有变量,则必须使用深度序列化。 (https://support.microsoft.com/en-us/kb/815813

所以我的建议是将这些属性公之于众。

否则,您可以查看此帖子: Serializing private member data

答案 3 :(得分:0)

来自MSDN page for XmlSerializer.Serialize

  

Serialize方法将对象的公共字段和读/写属性转换为XML。它不转换方法,索引器,私有字段或只读属性。要序列化所有对象的字段和属性(public和private),请使用BinaryFormatter。

因此,您需要公共字段或公共非只读属性,但您没有。

我建议:

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

或者如果你以后需要在setter中使用逻辑:

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; } }
}