单纯的账号密码这种非频繁读写,实现起来很简单的,游戏的属性信息到时候也许会比较麻烦。
思路:每次加入有新键值TryAdd,如果加入成功,直接重写账号密码文件即可。
C#JsonConvert.DeserializeObject反序列化与JsonConvert.SerializeObject序列化(一)-CSDN博客
在vs中->项目->NuGet,搜索安装Newtonsoft.Json。
转化部分的代码如下:
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();
}
第一次注册结果:
第二次注册结果:
写入过程的变量类型变化是dictionary->string->txt,写入应该是没有问题了 。
下面做一下初始化时候的读入,
在data函数中,账号信息由txt->string->(jobject-> ConcurrentDictionary)
读取所有账号信息,以及赋值给自定义字典的代码如下:
private ConcurrentDictionary<string, AccountModel> accounts = data();
private int d=1;
// private string o=data();
//private ConcurrentDictionary<string, AccountModel> accounts = JsonConvert.DeserializeObject(o);
public static ConcurrentDictionary<string, AccountModel> data()//这样好像就行了
{
Console.WriteLine("服务器启动时只执行一次!");//太好了,我需要的也是这种只执行一次的
StreamReader file = new StreamReader("login.txt");
string all = file.ReadToEnd();
file.Close();
Console.WriteLine(all);//id是有一个潜在问题的,但不允许重名,问题少很多
//JsonConvert.Deserialize<Dictionary<string, object>>(jsonData);
Console.WriteLine(JsonConvert.DeserializeObject(all));
Console.WriteLine(JsonConvert.DeserializeObject(all).GetType());
Console.WriteLine(JsonConvert.DeserializeObject(all).ToString());
ConcurrentDictionary<string, AccountModel> results = JsonConvert.DeserializeObject<ConcurrentDictionary<string, AccountModel>>(JsonConvert.DeserializeObject(all).ToString());
Console.WriteLine("上面的是转换后的object结果");
Console.WriteLine(results);
//ConcurrentDictionary<string, AccountModel> results = (ConcurrentDictionary)JsonConvert.DeserializeObject(all);
//Dictionary<string, string> results = JsonConvert.DeserializeObject<Dictionary<string, string>>(parsed["moretests"].ToString());
return results;
//return JsonConvert.DeserializeObject(all);
}
最后亲测,关闭服务器后,再次启动服务器,之前注册的账号可以一直保存在login.txt中。