在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是未处理的异常

任何想法?谢谢,迈克尔。

在c# .net中序列化文本框

您不能序列化控件,而是必须创建代表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,那么您将遵循以下步骤:

  1. 创建public类型作为文档的根元素,并将其标记为XmlRoot
  2. 添加由原始/内置类型或您自己的public自定义类型组成的元素/属性,这些类型也是XML可序列化的,必要时用XmlElementXmlAttribute标记它们。
  3. 要写入数据,使用XmlSerializer.Serialize与适当的Stream, StreamWriterXmlWriter以及根对象。
  4. 要将数据读入,使用XmlSerializer.Deseralize和适当的Stream, TextReaderXmlReader,将返回类型强制转换回根对象。

全样本。

要序列化的类型:

[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);