C#将对象的属性返回到XML
我正在制作一个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){
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; } }
}