C# Json反序列化对象错误
好吧,现在我遇到了一个非常奇怪的错误。我正在尝试反序列化GameEvent对象,如下所示: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
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); } }