C# 无法从导入的库中反序列化 class 的对象
C# Cannot deserialize object of class from imported library
在 Unity 项目中我有一些 class WsMessage 用于 WebSocket 交互。这个 class 位于我自己的库 WebSocketModels.
namespace WebSocketModels
{
[Serializable]
public enum WsMessageType
{
System, Player, Challenge, DeclineChallenge, RemoveChallenge, Game, Move, Moves, Chat,
Players, Challenges, Games, Clock
}
[Serializable]
public class WsMessage
{
public WsMessageType type { get; set; }
public string data { get; set; }
public WsMessage() { }
public WsMessage(WsMessageType type, string data)
{
this.type = type;
this.data = data;
}
}
}
由于某种原因,它无法反序列化。我没有看到任何错误。
如果我将此 class 从库直接移动到正常创建的 WsMessage 的 Unity 项目对象。
我使用这个简单的命令来获取 WsMessage 的对象:
WsMessage message = JsonConvert.DeserializeObject<WsMessage>(inputWsMessage);
将我的 Unity 播放器脚本后端更改为 IL2CPP 后,我遇到了这个问题。在 Mono 上一切正常。
JSON 内容示例
{"type":10,"data":"[{\"id\":\"0d8648e4-ce15-4084-87f9-f3de2b5a9b32\",\"fromPlayer\":{\"id\":\"af76e7c3-27b2-4d05-bcd3-f4b41c3bb7ba\",\"name\":\"Aydar\",\"rating\":1600.0,\"isOnline\":false},\"color\":0,\"timeControl\":{\"time_range\":10,\"time_increment\":5,\"control_type\":0},\"toPlayer\":null}]"}
看来问题出在这里了;
public WsMessageType type { get; set; }
public string data { get; set; }
为什么?因为 { get; set; }
是 getter 和 setter 方法的语法糖。
所以,换句话说,你上面的代码是 'equivalent' to;
public void WsMessageType_SetValue(WsMessageType value)
{
WsMessageType = value;
}
public WsMessageType WsMessageType_GetValue()
{
return WsMessageType;
}
'data'也是如此。
当你试图将一些数据序列化到某个函数中时,问题就出现了,它没有意义,而且 { get; set; }
快捷方式使它更难看到。
如果您使用变量而不是 getter/setter,它应该可以工作!
即;
public WsMessageType type;
public string data;
在 Unity 项目中我有一些 class WsMessage 用于 WebSocket 交互。这个 class 位于我自己的库 WebSocketModels.
namespace WebSocketModels
{
[Serializable]
public enum WsMessageType
{
System, Player, Challenge, DeclineChallenge, RemoveChallenge, Game, Move, Moves, Chat,
Players, Challenges, Games, Clock
}
[Serializable]
public class WsMessage
{
public WsMessageType type { get; set; }
public string data { get; set; }
public WsMessage() { }
public WsMessage(WsMessageType type, string data)
{
this.type = type;
this.data = data;
}
}
}
由于某种原因,它无法反序列化。我没有看到任何错误。 如果我将此 class 从库直接移动到正常创建的 WsMessage 的 Unity 项目对象。 我使用这个简单的命令来获取 WsMessage 的对象:
WsMessage message = JsonConvert.DeserializeObject<WsMessage>(inputWsMessage);
将我的 Unity 播放器脚本后端更改为 IL2CPP 后,我遇到了这个问题。在 Mono 上一切正常。
JSON 内容示例
{"type":10,"data":"[{\"id\":\"0d8648e4-ce15-4084-87f9-f3de2b5a9b32\",\"fromPlayer\":{\"id\":\"af76e7c3-27b2-4d05-bcd3-f4b41c3bb7ba\",\"name\":\"Aydar\",\"rating\":1600.0,\"isOnline\":false},\"color\":0,\"timeControl\":{\"time_range\":10,\"time_increment\":5,\"control_type\":0},\"toPlayer\":null}]"}
看来问题出在这里了;
public WsMessageType type { get; set; }
public string data { get; set; }
为什么?因为 { get; set; }
是 getter 和 setter 方法的语法糖。
所以,换句话说,你上面的代码是 'equivalent' to;
public void WsMessageType_SetValue(WsMessageType value)
{
WsMessageType = value;
}
public WsMessageType WsMessageType_GetValue()
{
return WsMessageType;
}
'data'也是如此。
当你试图将一些数据序列化到某个函数中时,问题就出现了,它没有意义,而且 { get; set; }
快捷方式使它更难看到。
如果您使用变量而不是 getter/setter,它应该可以工作!
即;
public WsMessageType type;
public string data;