Json десериализировать объектную ошибку - PullRequest
0 голосов
/ 04 июня 2018

Хорошо, теперь я столкнулся с очень странной ошибкой.Я пытаюсь десериализовать объект GameEvent, который выглядит следующим образом:

public class GameEvent {

public Location eventLocation = Location.NoLocation;
public Location targetLocation = Location.NoLocation;
public string eventTriggerName = ""; // Who (Piece or tactic) triggers this event
public string targetTriggerName = ""; // Target name
public int eventPlayerID = -1;
public int targetPlayerID = -1;
public string result = ""; // Piece, Tactic, Trap, Freeze, Move, Kill, Flag
public int amount = 0;

public GameEvent() { Debug.Log("Fuck"); }
public static string ClassToJson(GameEvent gameEvent)
{
    return JsonConvert.SerializeObject(gameEvent);
}
}

Однако, когда я десериализую его таким образом, он меняется странным образом.

public static GameEvent JsonToClass(string json)
{
    Debug.Log(json);
    GameEvent gameEvent = JsonConvert.DeserializeObject<GameEvent>(json);
    Debug.Log(ClassToJson(gameEvent));
    return JsonConvert.DeserializeObject<GameEvent>(json);
}

Как вы можете видетьиз рисунка ниже расположение события должно быть (7,2), но после десериализации оно становится (4,2).И eventLocation - единственное, что изменилось.

string json = "{\"eventLocation\": {\"x\": 7, \"y\": 2}, \"targetLocation\": {\"x\": 4, \"y\": 2} }";
var x = GameEvent.JsonToClass(json);

enter image description here

Понятия не имею, почему.Это мой класс Location

public class Location
{
    public int x = -1;
    public int y = -1;
    public Location(){}
    public Location(int X, int Y)
    {
        x = X;
        y = Y;
    }
    public Location(Location location)
    {
        x = location.x;
        y = location.y;
    }
    public static bool operator !=(Location a, Location b)
    {
        UnityEngine.Debug.Log(a + " " + b);
        return a.x != b.x || a.y != b.y;
    }
    public static Location NoLocation = new Location(-1, -1);
}

Я не опубликовал все функции класса GameEvent и Location, но я разместил все переменные, которые у них есть.

Кстати, я также встретил еще одну странную вещьпроблема с расположением.Когда я делаю if(eventLocation != Location.NoLocation), оператор! =, Который я переопределяю, на самом деле сравнивает не eventLocation с Location.NoLocation, а eventLocation (да, сам).Таким образом, a и b всегда будут одинаковыми, а! = Всегда вернет мне значение false.Я также понятия не имею, почему.

Спасибо заранее !!!

1 Ответ

0 голосов
/ 04 июня 2018

Ваша проблема исходит из этих двух строк:

public Location eventLocation = Location.NoLocation;
public Location targetLocation = Location.NoLocation;

Это происходит потому, что вы привязываете оба объекта к определенному объекту, который является NoLocation.Это означает, что как eventLocation, так и targetLocation указывают на один и тот же объект в памяти кучи, и изменение одного из них также приводит к изменению другого.

Изменение NoLocation на что-то подобное может решить вашу проблему:

public static Location NoLocation { get { return new Location(-1, -1); } }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...