C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: 書き込まれたXMLファイルに要素がない


(過去ログ 142 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■83221 / inTopicNo.1)  書き込まれたXMLファイルに要素がない
  
□投稿者/ りんご味 (1回)-(2017/03/13(Mon) 17:55:07)

分類:[C#] 

visual studioにて
http://ufcpp.net/study/algorithm/col_blist.htmlhttp://dobon.net/vb/dotnet/programing/storeappsettings.html
の「XMLファイルに保存する」の項を参考に双方向連結リスト2つをXMLファイルにシリアル化して
書き込もうとしているのですが、書き込まれるのは要素が全く書き込まれていないXMLファイルしかできません。
ご教授いただければ幸いです。

双方向連結リストはURLのものに加えてint型numという分類ナンバーのようなものを加えています。
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        public LinkedList  list1 = new LinkedList();
        public LinkedList list2 = new LinkedList();
        private void Form1_Load(object sender, EventArgs e)
        {

        public LinkedList  list1 = new LinkedList();
        public LinkedList list2 = new LinkedList();
        private void Form1_Load(object sender, EventArgs e)
        {
            listBox1.Items.Add(list1.InsertLast("すべて",0).Value);
            listBox1.Items.Add(list1.InsertLast("種類1",1).Value);
            listBox1.Items.Add(list1.InsertLast("種類2",2).Value);
            listBox1.Items.Add(list1.InsertLast("種類3",3).Value);
            listBox1.Items.Add(list1.InsertLast("種類4",4).Value);
            listBox1.Items.Add(list1.InsertLast("種類5",5).Value);
            listBox1.Items.Add(list1.InsertLast("種類6",6).Value);
            listBox1.Items.Add(list1.InsertLast("種類7",7).Value);

            listBox2.Items.Add(list2.InsertLast("名前1", 4).Value);
            listBox2.Items.Add(list2.InsertLast("名前2", 5).Value);
            listBox2.Items.Add(list2.InsertLast("名前3", 7).Value);
            listBox2.Items.Add(list2.InsertLast("名前4", 1).Value);
            listBox2.Items.Add(list2.InsertLast("名前5", 2).Value);
            listBox2.Items.Add(list2.InsertLast("名前6", 3).Value);
            listBox2.Items.Add(list2.InsertLast("名前7", 6).Value);

        }
//ファイル保存部分
        private void button1_Click(object sender, EventArgs e)
        {
            System.Xml.Serialization.XmlSerializer serializer1 =
                new System.Xml.Serialization.XmlSerializer(typeof(LinkedList));
            System.IO.StreamWriter sw1 = new System.IO.StreamWriter(
                "App1.config", false, new UTF8Encoding(false));
            serializer1.Serialize(sw1, list1);
            sw1.Close();
            System.Xml.Serialization.XmlSerializer serializer2 =
    new System.Xml.Serialization.XmlSerializer(typeof(LinkedList));
            System.IO.StreamWriter sw2 = new System.IO.StreamWriter(
                "App2.config", false, new UTF8Encoding(false));
            serializer2.Serialize(sw2, list2);
            sw2.Close();
        }
//ファイル書き込み部分
        private void button2_Click(object sender, EventArgs e)
        {
            System.Xml.Serialization.XmlSerializer serializer1 =
                new System.Xml.Serialization.XmlSerializer(typeof(LinkedList));
            System.IO.StreamReader sr1 = new System.IO.StreamReader(
                "App1.config", new UTF8Encoding(false));
            LinkedList obj1 = (LinkedList)serializer1.Deserialize(sr1);
            sr1.Close();
            System.Xml.Serialization.XmlSerializer serializer2 =
                new System.Xml.Serialization.XmlSerializer(typeof(LinkedList));
            System.IO.StreamReader sr2 = new System.IO.StreamReader(
                "App2.config", new UTF8Encoding(false));
            LinkedList obj2 = (LinkedList)serializer2.Deserialize(sr2);
            sr2.Close();
            listBox1.Items.Clear();
            listBox2.Items.Clear();
            LinkedList.Node n = list1.First;
            LinkedList.Node m = list2.First;
            while(n==list1.Last.Next)
            {
                listBox1.Items.Add(n);
                n = n.Next;
            }
            while (m == list2.Last.Next)
            {
                listBox1.Items.Add(m);
                m = m.Next;
            }
        }
//使用している双方向連結リストLinkedListクラス
        public class LinkedList
        {
            public class Node
            {
                #region フィールド

                string val;
                int num;
                Node prev;
                Node next;

                internal Node(string val, int num, Node prev, Node next)
                {
                    this.val = val;
                    this.num = num;
                    this.prev = prev;
                    this.next = next;
                }
                public string Value
                {
                    get { return this.val; }
                    set { this.val = value; }
                }
                public int Num
                {
                    get { return this.num; }
                    set { this.num = value; }
                }

                public Node Next
                {
                    get { return this.next; }
                    internal set { this.next = value; }
                }
                public Node Previous
                {
                    get { return this.prev; }
                    internal set { this.prev = value; }
                }


            }
            Node dummy;
            public LinkedList()
            {
                this.dummy = new Node(null, -1, null, null);
                this.dummy.Next = this.dummy;
                this.dummy.Previous = this.dummy;
            }
            public Node First
            {
                get { return this.dummy.Next; }
            }
            public Node Last
            {
                get { return this.dummy.Previous; }
            }
            public Node End
            {
                get { return this.dummy; }
            }
            public int Count
            {
                get
                {
                    int i = 0;
                    for (Node n = this.First; n != this.End; n = n.Next)
                        ++i;
                    return i;
                }
            }
            public Node InsertAfter(Node n, string elem, int num)
            {
                Node m = new Node(elem, num, n, n.Next);
                n.Next.Previous = m;
                n.Next = m;
                return m;
            }

            public Node InsertBefore(Node n, string elem, int num)
            {
                Node m = new Node(elem, num, n.Previous, n);
                n.Previous.Next = m;
                n.Previous = m;
                return m;
            }
            public Node InsertFirst(string elem, int num)
            {
                return this.InsertAfter(this.dummy, elem, num);
            }
            public Node InsertLast(string elem, int num)
            {
                return this.InsertBefore(this.dummy, elem, num);
            }
            public Node Erase(Node n)
            {
                if (n == this.dummy)
                {
                    return this.dummy;
                }
                n.Previous.Next = n.Next;
                n.Next.Previous = n.Previous;
                return n.Next;
            }
            public void EraseFirst()
            {
                this.Erase(this.First);
            }
            public void EraseLast()
            {
                this.Erase(this.Last);
            }
        }
書き込まれたXMLファイル(App1.config,App2.configどちらも)

<?xml version="1.0" encoding="utf-8"?>
<LinkedList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />




引用返信 編集キー/
■83223 / inTopicNo.2)  Re[1]: 書き込まれたXMLファイルに要素がない
□投稿者/ Hongliang (510回)-(2017/03/13(Mon) 18:12:24)
XmlSerializerは、getとset両方を持つpublicプロパティ(とpublicフィールド)のみをシリアライズ/デシリアライズの対象とします。
ルートオブジェクトはLinkedList型ですが、このLinkedListクラスには上記に該当するものが存在していません。

直接LinkedList型をシリアライズ/デシリアライズするのではなく、
・シリアライズ用の、stringとintをプロパティに持つクラス Hoge を作る
・シリアライズするときは、List<Hoge>に一旦コピーしそれをシリアライズする
・デシリアライズするときは、List<Hoge>にデシリアライズし、それを元にLinkedListを再構築する
というような手順を取るのはいかがでしょうか。

// なお、LinkedList自体はSystem.Collections.Genericに標準ライブラリとして用意されています。
引用返信 編集キー/
■83224 / inTopicNo.3)  Re[2]: 書き込まれたXMLファイルに要素がない
□投稿者/ りんご味 (2回)-(2017/03/13(Mon) 19:04:19)
No83223 (Hongliang さん) に返信
> XmlSerializerは、getとset両方を持つpublicプロパティ(とpublicフィールド)のみをシリアライズ/デシリアライズの対象とします。
> ルートオブジェクトはLinkedList型ですが、このLinkedListクラスには上記に該当するものが存在していません。
> 
> 直接LinkedList型をシリアライズ/デシリアライズするのではなく、
> ・シリアライズ用の、stringとintをプロパティに持つクラス Hoge を作る
> ・シリアライズするときは、List<Hoge>に一旦コピーしそれをシリアライズする
> ・デシリアライズするときは、List<Hoge>にデシリアライズし、それを元にLinkedListを再構築する
> というような手順を取るのはいかがでしょうか。
> 
ありがとうございます。早速その手法でやってみたのですが、型名が変わっただけでほぼ同じ状況です。
なにが間違っているのでしょうか…まずはシリアル化する方のみ掲載します
//変更後のメソッド内
            List<Hoge> clist1 = new List<Hoge>();
            LinkedList.Node n = list1.First;
            Hoge hoge1 = new Hoge();
            while(n==list1.Last.Next)
            {
                hoge1.name = n.Value;
                hoge1.num = n.Num;
                clist1.Add(hoge1);
                n = n.Next;
            }
            System.Xml.Serialization.XmlSerializer serializer1 =
                new System.Xml.Serialization.XmlSerializer(typeof(List<Hoge>));
            System.IO.StreamWriter sw1 = new System.IO.StreamWriter(
                "App1.config", false, new UTF8Encoding(false));
            serializer1.Serialize(sw1, clist1);
            sw1.Close();
            List<Hoge> clist2 = new List<Hoge>();
            LinkedList.Node m = list1.First;
            Hoge hoge2 = new Hoge();
            while (n == list1.Last.Next)
            {
                hoge2.name = n.Value;
                hoge2.num = n.Num;
                clist1.Add(hoge2);
                n = n.Next;
            }
            System.Xml.Serialization.XmlSerializer serializer2 =
    new System.Xml.Serialization.XmlSerializer(typeof(List<Hoge>));
            System.IO.StreamWriter sw2 = new System.IO.StreamWriter(
                "App2.config", false, new UTF8Encoding(false));
            serializer2.Serialize(sw2, clist2);
            sw2.Close();
//おっしゃっていたクラスHoge
        public class Hoge
        {
            public string name;
            public int num;
        }



> // なお、LinkedList自体はSystem.Collections.Genericに標準ライブラリとして用意されています。
こちらが解決したらそちらの方でもできるようにする予定です。

引用返信 編集キー/
■83226 / inTopicNo.4)  Re[3]: 書き込まれたXMLファイルに要素がない
□投稿者/ Hongliang (511回)-(2017/03/13(Mon) 19:35:44)
>             Hoge hoge1 = new Hoge();
>             while(n==list1.Last.Next)
>             {
>                 hoge1.name = n.Value;
>                 hoge1.num = n.Num;
>                 clist1.Add(hoge1);
>                 n = n.Next;
>             }
・ループの条件節が間違っていませんか?
・hoge1はループ内で毎回newするようにしましょう。

あと、Hogeってのはさすがにアレなので適切と思われる名前をお使い下さい。

引用返信 編集キー/
■83227 / inTopicNo.5)  Re[4]: 書き込まれたXMLファイルに要素がない
□投稿者/ りんご味 (3回)-(2017/03/13(Mon) 21:34:11)
No83226 (Hongliang さん) に返信
> > Hoge hoge1 = new Hoge();
>> while(n==list1.Last.Next)
>> {
>> hoge1.name = n.Value;
>> hoge1.num = n.Num;
>> clist1.Add(hoge1);
>> n = n.Next;
>> }
> ・ループの条件節が間違っていませんか?
> ・hoge1はループ内で毎回newするようにしましょう。
> ありがとうございます。この2つが間違っていました。思った挙動になりました。
解決済み
引用返信 編集キー/
■83228 / inTopicNo.6)  Re[5]: 書き込まれたXMLファイルに要素がない
□投稿者/ りんご味 (4回)-(2017/03/13(Mon) 21:40:45)
間違っていたのはnewのほうでした。
以下できたコード

private void button1_Click(object sender, EventArgs e)
{
List<Student> clist1 = new List<Student>();
LinkedList.Node n = list1.First;
while(true)
{
Student student1 = new Student();
student1.name = n.Value;
student1.num = n.Num;
clist1.Add(student1);
n = n.Next;
if (n == list1.Last.Next) break;
}
System.Xml.Serialization.XmlSerializer serializer1 =
new System.Xml.Serialization.XmlSerializer(typeof(List<Student>));
System.IO.StreamWriter sw1 = new System.IO.StreamWriter(
"App1.config", false, new UTF8Encoding(false));
serializer1.Serialize(sw1, clist1);
sw1.Close();
List<Student> clist2 = new List<Student>();
LinkedList.Node m = list2.First;
while (true)
{
Student student2 = new Student();
student2.name = m.Value;
student2.num = m.Num;
clist2.Add(student2);
m = m.Next;
if (m == list2.Last.Next) break;
}
System.Xml.Serialization.XmlSerializer serializer2 =
new System.Xml.Serialization.XmlSerializer(typeof(List<Student>));
System.IO.StreamWriter sw2 = new System.IO.StreamWriter(
"App2.config", false, new UTF8Encoding(false));
serializer1.Serialize(sw2, clist2);
sw2.Close();

}

private void button2_Click(object sender, EventArgs e)
{
System.Xml.Serialization.XmlSerializer serializer1 =
new System.Xml.Serialization.XmlSerializer(typeof(List<Student>));
System.IO.StreamReader sr1 = new System.IO.StreamReader(
"App1.config", new UTF8Encoding(false));
List<Student> clist1 = (List<Student>)serializer1.Deserialize(sr1);
sr1.Close();
System.Xml.Serialization.XmlSerializer serializer2 =
new System.Xml.Serialization.XmlSerializer(typeof(List<Student>));
System.IO.StreamReader sr2 = new System.IO.StreamReader(
"App2.config", new UTF8Encoding(false));
List<Student> clist2 = (List<Student>)serializer2.Deserialize(sr2);
sr2.Close();
listBox1.Items.Clear();
listBox2.Items.Clear();
int i = 0;
while(i<clist1.Count())
{
Student student1 = clist1.ElementAt(i);
listBox1.Items.Add(list1.InsertLast(student1.name, student1.num).Value);
i++;
}
i = 0;
while (i<clist2.Count())
{
Student student2 = clist2.ElementAt(i);
listBox2.Items.Add(list2.InsertLast(student2.name, student2.num).Value);
i++;
}
}

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -