我有一个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();
}
答案 0 :(得分:1)
我认为这与标记为pairs
的{{1}}有关。我不相信static
会在向其添加元素之前清除列表,因此每次调用XmlSerializer
时,您都会创建重复的条目,而不是覆盖现有的条目。
总的来说,我观察到序列化和全局变量不能很好地结合在一起。为此,“全局变量”包括私有静态,单例,像这样的monostate类,以及线程局部变量。
在使用XML和二进制序列化之间看起来也有一些问题。他们是完全不同的野兽。 XML序列化仅查看类的公共属性,而二进制序列化仅查看类的实例字段。此外,XML序列化忽略openScores()
属性。