在c# .net中序列化文本框
本文关键字:文本 序列化 net | 更新日期: 2023-09-27 18:18:43
我是。net环境的初学者。我有一个windows应用程序与三个文本框和一个按钮。当用户单击按钮时,我希望所有文本框的值都以XML格式序列化到一个文件中。我试过这样做,
DialogResult dr = new DialogResult();
private void button1_Click(object sender, EventArgs e)
{
AddCustomer customer = new AddCustomer();
customer.textBox1.Text = textBox1.Text;
customer.textBox2.Text = textBox2.Text;
customer.textBox3.Text = textBox3.Text;
customer.textBox4.Text = textBox4.Text;
saveFileDialog1.InitialDirectory = @"D:";
saveFileDialog1.Filter = "Xml Files | *.xml";
if (saveFileDialog1.ShowDialog().Equals(DialogResult.OK))
{
SerializeToXML(customer);
}
}
public void SerializeToXML(AddCustomer customer)
{
XmlSerializer serializer = new XmlSerializer(typeof(AddCustomer));
TextWriter textWriter = new StreamWriter(@"D:'customer.xml");
serializer.Serialize(textWriter, customer);
textWriter.Close();
}
返回的系统。Invalidoperationexception是未处理的异常
任何想法?谢谢,迈克尔。
您不能序列化控件,而是必须创建代表TextBox值的Serializable
组件。(要了解更多细节,请阅读MSDN文章)。
[Serializable]
public class Customer
{
public string Name { get; set; }
public string Address {get;set;}
}
你不应该序列化文本框对象,只序列化它们的值。customer.textBox1
应该是字符串类型的customer.text1
。然后只需要分配customer.text1 = textbox1.text
。另外,用[Serializable]
属性标记AddCustomer
类。
添加新类Customer
[Serializable]
public class Customer
{
public string FullName { get; set; }
public string Age { get; set; }
}
尝试像这样序列化
Customer customer = new Customer();
customer.FullName = "John"; // or customer.FullName = textBox1.Text
customer.Age = "21"; // or customer.Age = textBox2.Text
XmlSerializer serializer = new XmlSerializer(typeof(Customer));
TextWriter textWriter = new StreamWriter(@"D:'customer.xml");
serializer.Serialize(textWriter, customer);
textWriter.Close();
这样做之后,我得到一个包含以下内容的xml文件。
<?xml version="1.0" encoding="utf-8"?>
<Customer xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<FullName>John</FullName>
<Age>21</Age>
</Customer>
试着比较一下你做错了什么
有很多方法可以在。net中编写XML。这里有一种使用XmlWriter
的方法,它适用于非常简单的内容,比如在这个例子中:
string text1 = /* get value of textbox */;
string text2 = /* get value of textbox */;
string text3 = /* get value of textbox */;
// Set indent=true so resulting file is more 'human-readable'
XmlWriterSettings settings = new XmlWriterSettings() { Indent = true };
// Put writer in using scope; after end of scope, file is automatically saved.
using (XmlWriter writer = XmlTextWriter.Create("file.xml", settings))
{
writer.WriteStartDocument();
writer.WriteStartElement("root");
writer.WriteElementString("text1", text1);
writer.WriteElementString("text2", text2);
writer.WriteElementString("text3", text3);
writer.WriteEndElement();
}
注意:你应该避免在UI线程上做文件操作,因为这可能会导致阻塞行为(例如,磁盘可能很慢,导致UI在写文件时冻结,或者它可能正在写网络位置并在连接时挂起一段时间)。最好是弹出进度对话框,提示"文件保存时请稍等……",在后台进行文件操作;一种简单的方法是使用BeginInvoke
/EndInvoke
将后台操作发布到线程池。
如果您想使用XmlSerializer,那么您将遵循以下步骤:
- 创建
public
类型作为文档的根元素,并将其标记为XmlRoot
。 - 添加由原始/内置类型或您自己的
public
自定义类型组成的元素/属性,这些类型也是XML可序列化的,必要时用XmlElement
或XmlAttribute
标记它们。 - 要写入数据,使用
XmlSerializer.Serialize
与适当的Stream
,StreamWriter
或XmlWriter
以及根对象。 - 要将数据读入,使用
XmlSerializer.Deseralize
和适当的Stream
,TextReader
或XmlReader
,将返回类型强制转换回根对象。
全样本。
要序列化的类型:
[XmlRoot("customer")]
public class CustomerData
{
// Must have a parameterless public constructor
public CustomerData()
{
}
[XmlElement("name")]
public string Name { get; set; }
[XmlElement("city")]
public string City { get; set; }
[XmlElement("company")]
public string Company { get; set; }
public override string ToString()
{
return
"Name=[" + this.Name + "] " +
"City=[" + this.City + "] " +
"Company=[" + this.Company + "]";
}
}
读取/写入数据的代码:
// Initialize the serializer to write and read the data
XmlSerializer serializer = new XmlSerializer(typeof(CustomerData));
// Initialize the data to serialize
CustomerData dataToWrite = new CustomerData()
{
Name = "Joel Spolsky",
City = "New York",
Company = "Fog Creek Software"
};
// Write it out
XmlWriterSettings settings = new XmlWriterSettings() { Indent = true };
using (XmlWriter writer = XmlTextWriter.Create("customer.xml", settings))
{
serializer.Serialize(writer, dataToWrite);
}
// Read it back in
CustomerData dataFromFile = null;
using (XmlReader reader = XmlTextReader.Create("customer.xml"))
{
dataFromFile = (CustomerData)serializer.Deserialize(reader);
}
Console.WriteLine(dataFromFile);