C#将对象的属性返回到XML

C#将对象的属性返回到XML,c#,xml,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){

我正在制作一个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(){
客户客户=新客户();
客户设置客户名称(“测试”);
cust.setCustomerAge();
序列化对象(cust、savePath)
}
public void SerializeObject(T serializableObject,字符串文件名){
if(serializableObject==null){
返回;
}
试一试{
XmlDocument XmlDocument=新的XmlDocument();
XmlSerializer serializer=新的XmlSerializer(serializableObject.GetType());
使用(MemoryStream stream=new MemoryStream()){
serializer.Serialize(流,serializableObject);
流位置=0;
加载(流);
xmlDocument.Save(文件名);
stream.Close();
}
}捕获(例外情况除外){
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" />


我是否以错误的方式处理此问题,是否应该使用完全不同的方法?

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

这样,您的返回方法就像

public int customerAge(){
     return age;
 }
不再需要了。获取和设置属性的方法在C#中并不常见(我认为这类似于Java)。查看如何在C#中执行此操作。

来自MSDN:

Serialize方法转换公共字段和读/写 将对象的属性转换为XML。它不转换方法, 索引器、专用字段或只读属性


除了对象本身,您没有什么可序列化的。

Xml.Serialization.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; } }
}

旁注:我从未见过有人像这样为C#中的私有汽车属性创建java风格的访问器。您可能应该仔细阅读一下属性是什么以及它们是如何使用的。@Fruchtzwerg感谢您的回答,但我希望在porpuse上保留这两个变量的私有性。这很好,但让它们成为具有{get;set;}这样的自动属性是没有意义的。此外,惯例是在C#中使用PASCALCING而不是CAMELLOCASING!除了{get;set;}之外,我还有什么真正的愚蠢之处。serializer可以从“customerName()”和“customerAge()”获取值?xml序列化程序正在对您提供的对象类型进行反射,它需要可公开访问的属性来读取/写入属性,方法与序列化无关。因此,我不必将属性设置为私有,然后像这样返回它们?是的,在示例代码中,您可以读取,但不能从外部更改值。请等待您的答案。我刚刚意识到我基本上对xmlserializer一无所知。
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; } }
}