1.经过一系列调试,定位到UserCache.cs中的put函数,内容如下:
cs
public void put(string accId, PlayerModel model)
{
if (this.userPlayerIds.ContainsKey(accId))
{
List<string> stringList;
this.userPlayerIds.TryGetValue(accId, out stringList);//得到已有的角色id(player)
stringList.Add(model.id);//新加一个
}
else
this.userPlayerIds.TryAdd(accId, new List<string>()
{
model.id
});
this.players.TryAdd(model.id, model);//最后真正怎加角色信息 player=角色 account=账号
}
2.TryAdd是系统函数,所以最终的结果就存在this.player中!跳转到其定义位置

3.把之前账号密码服务器化的技巧应用过来:
ctrf+f可以进行查找,快速找到之前账号密码的数据库化部分:

4.账号密码写入部分的代码如下:
cs
bool r=this.accounts.TryAdd(userName, accountModel);
if (r)
{
Console.WriteLine("成功注册时,写入文件");
StreamWriter file = new StreamWriter("login.txt");
string json = JsonConvert.SerializeObject(this.accounts);
Console.WriteLine("字典转json之后的内容:"+ json);
file.Write(json);
file.Close();
}
字典的TryAdd操作之后进行文件写入。
5.账号密码初始化部分的代码如下:自建data初始化函数。
cs
public static ConcurrentDictionary<string, AccountModel> data()//这样好像就行了
{
StreamReader file = new StreamReader("login.txt");
string all = file.ReadToEnd();
file.Close();
ConcurrentDictionary<string, AccountModel> results = JsonConvert.DeserializeObject<ConcurrentDictionary<string, AccountModel>>(JsonConvert.DeserializeObject(all).ToString());
return results;
}
data函数的调用位置:

6.角色信息的读取部分的代码如下:
cs
private ConcurrentDictionary<string, List<string>> userPlayerIds = dataUserPlayerIds();
//private ConcurrentDictionary<string, List<string>> userPlayerIds = new ConcurrentDictionary<string, List<string>>();
//private ConcurrentDictionary<string, PlayerModel> players = new ConcurrentDictionary<string, PlayerModel>();
private ConcurrentDictionary<string, PlayerModel> players = dataPlayers();
public static ConcurrentDictionary<string, List<string>> dataUserPlayerIds()//这样好像就行了
{
StreamReader file = new StreamReader("userPlayerIds.txt");
string all = file.ReadToEnd();
file.Close();
ConcurrentDictionary<string, List<string>> results = JsonConvert.DeserializeObject<ConcurrentDictionary<string, List<string>>>(JsonConvert.DeserializeObject(all).ToString());
return results;
//return JsonConvert.DeserializeObject(all);
}
public static ConcurrentDictionary<string, PlayerModel> dataPlayers()//这样好像就行了
{
StreamReader file = new StreamReader("players.txt");
string all = file.ReadToEnd();
file.Close();
ConcurrentDictionary<string, PlayerModel> results = JsonConvert.DeserializeObject<ConcurrentDictionary<string, PlayerModel>>(JsonConvert.DeserializeObject(all).ToString());
return results;
//return JsonConvert.DeserializeObject(all);
}
7.角色信息的写入部分的代码如下:
cs
public void put(string accId, PlayerModel model)
{
if (this.userPlayerIds.ContainsKey(accId))
{
List<string> stringList;
this.userPlayerIds.TryGetValue(accId, out stringList);//得到已有的角色id(player)
stringList.Add(model.id);//新加一个
}
else
{
bool ur=this.userPlayerIds.TryAdd(accId, new List<string>()
{
model.id
});
if (ur)
{
StreamWriter file = new StreamWriter("userPlayerIds.txt");
string json = JsonConvert.SerializeObject(this.userPlayerIds);
Console.WriteLine("userPlayerIds.TryAdd:" + json);
file.Write(json);
file.Close();
}
}
bool pr=this.players.TryAdd(model.id, model);//最后真正怎加角色信息 player=角色 account=账号
//将角色详细信息写入文件
if (pr)
{
StreamWriter file = new StreamWriter("players.txt");
string json = JsonConvert.SerializeObject(this.players);
Console.WriteLine("players.TryAdd:" + json);
file.Write(json);
file.Close();
}
}
8.调试出现异常!

9.调试解决异常:提前手动创建2个txt文件即可。


10.出现新的异常:应该是第一次读取文件时存在问题。
