Сериализация текстового поля в C # .net - PullRequest
0 голосов
/ 26 декабря 2011

Я новичок в среде .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();
    }

это возвращенное system.invalidoperationexception было необработанным исключением

какие-нибудь идеи?Спасибо, Майкл

Ответы [ 3 ]

1 голос
/ 26 декабря 2011

Вы не должны сериализовать объект textbox, только его значения. customer.textBox1 должно быть customer.text1 типа string. Затем вам нужно просто присвоить customer.text1 = textbox1.text. Также отметьте свой класс AddCustomer с атрибутом [Serializable].

Edit: это код, который я только что попробовал, и он отлично работает. Посмотрите, сможете ли вы заставить его работать в вашем решении.

Добавить новый класс 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>

Попробуйте и сравните, чтобы увидеть, что вы делаете неправильно.

1 голос
/ 26 декабря 2011

Вы не можете сериализовать элементы управления, вместо этого вам нужно создать Serializable компонент, который представляет значения TextBox. (Подробнее читайте MSDN статья).

Например,

[Serializable]
public class Customer
{
    public string Name { get; set; }
    public string Address {get;set;}
}
0 голосов
/ 26 декабря 2011

Существует множество способов написания XML в .NET.Вот способ использования 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();
}

Одно замечание: вам следует избегать операций с файлами в потоке пользовательского интерфейса, так как это можетможет привести к блокировке (например, диск может работать медленно и вызвать зависание пользовательского интерфейса во время записи файла, или он может записывать данные в сетевое расположение и некоторое время зависать при подключении).Лучше всего открыть диалоговое окно прогресса и отобразить сообщение «Пожалуйста, подождите, пока файл будет сохранен ...» и выполните операцию с файлом в фоновом режиме;простой способ - опубликовать фоновую операцию в пуле потоков , используя BeginInvoke / EndInvoke.


Если вы хотите использовать вместо этого XmlSerializer, тогда вы должны следовать этимшаги:

  1. Создайте тип public, который будет выступать в качестве корневого элемента вашего документа, и пометьте его XmlRoot.
  2. Добавить элементы / атрибуты.из простых или встроенных типов или из ваших собственных public пользовательских типов, которые также можно сериализовать в формате XML, помечая их XmlElement или XmlAttribute при необходимости.
  3. Чтобы записать данные, используйте XmlSerializer.Serialize с соответствующими Stream, StreamWriter или XmlWriter вместе с корневым объектом.
  4. Чтобы прочитатьверните данные, используйте 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);
...