2

このプロジェクトでは、 Newtonsoft.Json .Netfor4.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は、サーバーのメモリ内のすべてのプレーヤーを1行に1つずつシリアル化します

そのようです:

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);
    }
}

1行の例を次に示します。

何が入る:

"{\"hp_cur_changed\":null,\"hp_max_changed\":null,\"id\":1,\"hp_max\":100.0,\"hp_cur\":100.0}"

CPlayer.Deserialize()から何が出てくるか:

アウト

IDを逆シリアル化するだけで、親クラスのプロパティは無視されます。サーバー側がそれを適切にシリアル化したので、これは奇妙です。誰かがこれを修正する方法を教えてもらえますか?

4

1 に答える 1

1

なぜこのように機能するのか公式のリファレンスを見つけることができませんでしたが、問題を解決するには少なくとも2つの方法があります。

基本クラスのプロパティセッターをパブリックとして宣言します

 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; }
于 2012-09-17T19:01:48.440 に答える