List的XML序列化变得太大了

时间:2010-11-12 22:24:19

标签: c# xml serialization xml-serialization

我有一个C#Windows窗体应用程序,它在IRC频道上运行Trivia游戏,并保留它要求的问题,以及我序列化为XML的类中的排行榜(分数),以便在会话之间保存。我一直在讨论的问题最好用流程来描述,所以这里是:

User X获取Leaderboard类中的条目,得分为1.类保存为XML,XML包含用户X的一个条目。

用户Y在Leaderboard类中获得分数为1的类。类保存为XML,XML包含用户X的重复条目,以及用户Y的一个条目。

运行一周后,用户不到20人,我希望能够用PHP编写一个Web后端来帮助我使用这些分数。 XML文件是2兆字节。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization;

namespace IRCTriviaBot
{
    [Serializable()]    
    public class LeaderBoard 
    {
        [Serializable()]
        public class Pair
        {
            public string user;
            public int score;
            public Pair(string usr, int scr)
            {
                user = usr;
                score = scr;
            }
            public Pair() { }
        }
        private static List<Pair> pairs = null;
        public List<Pair> Pairs
        {
            get
            {
                if (pairs==null)
                {
                    pairs = new List<Pair>();

                }
                return pairs;
            }
        }
        public LeaderBoard()
        {

        }
        public void newScore(string usr)
        {
            bool found = false;
            for (int i = 0; i < Pairs.Count && !found; ++i)
            {
                if (Pairs[i].user==usr)
                {
                    found = true; 
                    Pairs[i].score++;
                }
            }
            if (!found)
            {
                Pairs.Add(new Pair(usr, 1));
            }
        }

        public int getScore(string usr)
        {
            bool found = false;
            for (int i = 0; i < Pairs.Count && !found; ++i)
            {
                if (Pairs[i].user == usr)
                {
                    return Pairs[i].score;
                }
            }
            if (!found)
            {
                return 0;
            }
            return 0;
        }
    }
}

这是序列化和反序列化发生的地方。

       void parseMessage(string message, string user = "")
    {
        if (message == "-startgame-")
        {
            if (!gameStarted)
            {
                gameStarted = true;
                openScores();
                startGame();
            }
        }
        else if (message == "-hint-")
        {
            if (!hintGiven && gameStarted)
            {
                sendMessage("Here's a better hint: " + Form2.qa.Answers[curQ].Trim());
                hintGiven = true;
            }

        }
        else if (message == "-myscore-")
        {
            sendMessage(user + ", your score is: " + leaderB.getScore(user));
        }

        else if (message.ToLower() == Form2.qa.Answers[curQ].ToLower())
        {
            if (gameStarted)
            {
                sendMessage(user + " got it right! Virtual pat on the back!");
                leaderB.newScore(user);
                saveScores();
                System.Threading.Thread.Sleep(2000);
                startGame();
            }
        }
        else if (message == "-quit-")
        {
            if (gameStarted)
            {
                sendMessage("Sorry to see you go! Have fun without me :'(");
                gameStarted = false;
            }
            else
            {
                sendMessage("A game is not running.");
            }
        }
        else
        {
            if (gameStarted)
            {
                //sendMessage("Wrong.");
            }
        }
    }

    void saveScores()
    {
        //Opens a file and serializes the object into it in binary format.
        Stream stream = System.IO.File.Open("scores.xml", FileMode.Open);
        XmlSerializer xmlserializer = new XmlSerializer(typeof(LeaderBoard));

        //BinaryFormatter formatter = new BinaryFormatter();

        xmlserializer.Serialize(stream, leaderB);
        stream.Close();
    }

    void openScores()
    {
        Stream stream = System.IO.File.OpenRead("scores.xml");
        XmlSerializer xmlserializer = new XmlSerializer(typeof(LeaderBoard));

        //BinaryFormatter formatter = new BinaryFormatter();

        leaderB = (LeaderBoard)xmlserializer.Deserialize(stream);
        stream.Close();
    }

1 个答案:

答案 0 :(得分:1)

我认为这与标记为pairs的{​​{1}}有关。我不相信static会在向其添加元素之前清除列表,因此每次调用XmlSerializer时,您都会创建重复的条目,而不是覆盖现有的条目。

总的来说,我观察到序列化和全局变量不能很好地结合在一起。为此,“全局变量”包括私有静态,单例,像这样的monostate类,以及线程局部变量。

在使用XML和二进制序列化之间看起来也有一些问题。他们是完全不同的野兽。 XML序列化仅查看类的公共属性,而二进制序列化仅查看类的实例字段。此外,XML序列化忽略openScores()属性。