c# - Json反序列化对象错误
问题描述
好的,现在我遇到了一个非常奇怪的错误。我正在尝试反序列化一个 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);
}
从下图中可以看出,eventLocation 应该是 (7,2),但反序列化后它变成 (4,2)。而 eventLocation 是唯一改变的东西。
string json = "{\"eventLocation\": {\"x\": 7, \"y\": 2}, \"targetLocation\": {\"x\": 4, \"y\": 2} }";
var x = GameEvent.JsonToClass(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(是的本身)进行比较。所以 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); } }
推荐阅读
- amazon-web-services - AWS 中的 UDP/TCP 服务器
- python-3.x - 在python中使用google transliterate api
- python - 子类LoginView时,Django'NoneType'对象没有属性'has_header'
- android - 如何为每个android用户安排firebase数据库项目
- python - 使用缩放和平方方法而不是欧拉方法进行积分
- google-sheets - 记录电子表格中的更改
- sql - sql根据两列中的某个值添加具有唯一ID的列
- jquery - Html 选择选项不适用于移动设备
- c# - 在接收消息 Azure 时使用 SQLFilter
- php - PHP 使用“x-mac-roman”编码创建 XML 文件