0

.NET環境の初心者です。3 つのテキスト ボックスと 1 つのボタンを備えた 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 は未処理の例外でした

何か案は?ありがとう、マイケル

4

3 に答える 3

1

コントロールをシリアル化することはできません。代わりに、SerializableTextBox 値を表すコンポーネントを作成する必要があります。(詳細については、MSDNの記事を参照してください)。

例えば、

[Serializable]
public class Customer
{
    public string Name { get; set; }
    public string Address {get;set;}
}
于 2011-12-26T03:04:29.007 に答える
1

テキストボックス オブジェクトをシリアル化するのではなく、その値のみをシリアル化する必要があります。 customer.textBox1文字列型である必要がcustomer.text1あります。次に、を割り当てるだけcustomer.text1 = textbox1.textです。AddCustomerまた、クラスを[Serializable]属性でマークします。

編集:これは私が試したばかりのコードで、正常に動作します。ソリューションで機能するかどうかを確認してください。

新しいクラスを追加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>

比較して、何が間違っているかを確認してください。

于 2011-12-26T03:07:05.163 に答える
0

.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();
}

1 つの注意: UI スレッドでファイル操作を行うと、ブロック動作が発生する可能性があるため、避ける必要があります (たとえば、ディスクが遅くなり、ファイルの書き込み中に UI がフリーズする可能性があるか、ネットワーク上の場所に書き込みを行っている可能性があります)。接続中にしばらくハングします)。進行状況ダイアログを表示し、「ファイルが保存されるまでお待ちください...」というメッセージを表示し、バックグラウンドでファイル操作を行うのが最善です。簡単な方法は、 /を使用しBeginInvokeEndInvokeてバックグラウンド操作をスレッド プールにポストすることです。


代わりに XmlSerializer を使用する場合は、次の手順に従います。

  1. publicドキュメントのルート要素として機能するタイプを作成し、それを でマークしXmlRootます。
  2. プリミティブ/組み込み型、またはpublicXML シリアル化も可能な独自のカスタム型のいずれかで構成される要素/属性を追加し、必要に応じて、XmlElementまたはでマークしますXmlAttribute
  3. データを書き出すにはXmlSerializer.Serialize、適切なStreamStreamWriter、またはXmlWriterルート オブジェクトとともに使用します。
  4. データを読み戻すにはXmlSerializer.Deseralize、適切なStreamTextReader、またはを使用して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);
于 2011-12-26T03:08:34.760 に答える