Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Json反序列化对象错误_C#_Unity3d_Serialization_Json.net - Fatal编程技术网

C# Json反序列化对象错误

C# Json反序列化对象错误,c#,unity3d,serialization,json.net,C#,Unity3d,Serialization,Json.net,好吧,现在我遇到了一个非常奇怪的错误。我正在尝试反序列化GameEvent对象,如下所示: public class GameEvent { public Location eventLocation = Location.NoLocation; public Location targetLocation = Location.NoLocation; public string eventTriggerName = ""; // Who (Piece or tactic) triggers

好吧,现在我遇到了一个非常奇怪的错误。我正在尝试反序列化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);
}

我不知道为什么。这是我的定位课

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(yeah本身)。所以a和b总是一样的,而且总是会给我错误的回答。我也不知道为什么


提前感谢

您的问题来自以下两个方面:

public Location eventLocation = Location.NoLocation;
public Location targetLocation = Location.NoLocation;
之所以会发生这种情况,是因为您将两个对象绑定到一个特定的对象,而该对象是NoLocation。这意味着eventLocation和targetLocation都指向堆内存中的同一对象,更改其中一个对象也会更改另一个对象

将NoLocation更改为类似这样可以解决您的问题:

public static Location NoLocation { get { return new Location(-1, -1); } }

您可以发布ClassToJson方法的代码吗?顺便说一句,这是一个非常有趣的字符串写入日志。请记住在推送代码之前更改它。我注意到在Location类的构造函数中没有遵循命名约定:它应该是X,Y应该是小写的,我认为问题在于静态属性。尝试将其设置为非静态,因为我们需要一个对象进行序列化。请尝试复制并发布。这也解释了关于比较的最后一段,因为
Location.NoLocation
基本上已被覆盖,它看起来像是在与自身进行比较,而不是预期的(-1,-1),但是由于Location.NoLocation是一个已经更改的实例,它实际上是在将同一个实例与自身进行比较。是的,由于NoLocation是一个静态字段,它只被实例化一次,因此引用不会被破坏,除非我们使用new关键字重新创建它。
public static Location NoLocation { get { return new Location(-1, -1); } }