我正在为此项目使用Newtonsoft.Json .Net for 4.0
家长班:
public class CLiveThing
{
private object lawk = new object();
public Action<double> hp_cur_changed;
public Action<double> hp_max_changed;
public double hp_max { get; private set; }
public double hp_cur { get; private set; }
public void change_hp_max(double val)
{
lock (lawk)
{
hp_max += val;
if (hp_max_changed != null)
hp_max_changed(hp_max);
}
}
public void change_hp_cur(double val)
{
lock (lawk)
{
hp_cur += val;
if (hp_cur_changed != null)
hp_cur_changed(hp_cur);
}
}
}
儿童班:
public class CPlayer : CLiveThing
{
public int id { get; private set; }
public CPlayer(int id)
{
this.id = id;
}
/*
* Network
*/
public string Serialize()
{
return Newtonsoft.Json.JsonConvert.SerializeObject(this);
}
public static CPlayer Deserialize(string val)
{
return Newtonsoft.Json.JsonConvert.DeserializeObject<CPlayer>(val);
}
}
服务器(使用Players.CPlayers管理具有通用集合的所有玩家)
Players.CPlayers.Serialize()
Players.CPlayers.Serialize序列化服务器内存中的所有玩家,每行一个
像这样:
public static string Serialize()
{
players_lock.AcquireReaderLock(Timeout.Infinite);
string str = "";
foreach (CPlayer player in players.Values)
{
str += player.Serialize();
str += Environment.NewLine;
}
players_lock.ReleaseReaderLock();
return str;
}
客户端
我在Players.CPlayers.Deserialize循环中放了一个断行,它反转了服务器所做的事情。
foreach (string line in split)
{
if (line.Length > 0)
{
CPlayer player = CPlayer.Deserialize(line);
addOrReplace(player.id, player);
}
}
以下是一行示例:
进展情况:
"{\"hp_cur_changed\":null,\"hp_max_changed\":null,\"id\":1,\"hp_max\":100.0,\"hp_cur\":100.0}"
CPlayer.Deserialize():
它仅反序列化ID并忽略父类中的属性。这很奇怪,因为服务器端确实正确地序列化了它。有谁能告诉我如何解决这个问题?
答案 0 :(得分:1)
我无法找到官方参考,为什么它的工作方式如此,但至少有两种方法可以解决您的问题:
将您的基类属性setter声明为public
public double hp_cur { get; set; }
public double hp_max { get; set; }
或使用JsonProperty
属性注释它们:
[JsonProperty]
public double hp_max { get; private set; }
[JsonProperty]
public double hp_cur { get; private set; }