我正在制作一个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 :(得分: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; } }
}