-1

在 Unity 项目中,我有一些用于 WebSocket 交互的 WsMessage 类。这个类位于我自己的库 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;
        }
    }
}

由于某种原因,它不能被反序列化。我没有看到任何错误。如果我将此类从库直接移动到正常创建的 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}]"}
4

1 回答 1

0

所以,似乎问题就在这里;

public WsMessageType type { get; set; }
public string data { get; set; }

为什么?因为{ get; set; }是 getter 和 setter 方法的语法糖。

因此,换句话说,您上面的代码“等效于”;

public void WsMessageType_SetValue(WsMessageType value)
{
    WsMessageType = value;    
}

public WsMessageType WsMessageType_GetValue()
{
    return WsMessageType;
}

“数据”也是如此。

当您尝试将某些数据序列化为某个函数时,就会出现问题,这没有意义,而且{ get; set; }快捷方式使其更难看到。

如果您使用变量而不是 getter/setter 它应该可以工作!

IE;

public WsMessageType type;
public string data;
于 2020-07-15T16:06:58.353 回答