C# Невозможно десериализовать объект класса из импортированной библиотеки - PullRequest
0 голосов
/ 14 июля 2020

В проекте Unity у меня есть класс WsMessage для взаимодействия с WebSocket. Этот класс находится в моей собственной библиотеке 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;
        }
    }
}

По какой-то причине он не может быть десериализован. Ошибок не увидел. Если я перенесу этот класс из библиотеки непосредственно в объект проекта Unity из WsMessage, создается нормально. Я использую эту простую команду для получения объекта WsMessage:

WsMessage message = JsonConvert.DeserializeObject<WsMessage>(inputWsMessage);

Я столкнулся с этой проблемой после того, как изменил свой скриптовый сервер Unity Player на IL2 CPP. На 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}]"}

1 Ответ

0 голосов
/ 15 июля 2020

Итак, похоже, проблема здесь;

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

Почему? потому что { get; set; } - это синтаксис c сахар для методов получения и установки.

Другими словами, ваш код выше эквивалентен;

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

public WsMessageType WsMessageType_GetValue()
{
    return WsMessageType;
}

И то же самое для 'data'.

Проблема возникает, когда вы пытаетесь сериализовать некоторые данные в какую-либо функцию, это не имеет смысла, а ярлык { get; set; } затрудняет просмотр.

Если вы используете переменные вместо геттера / сеттера, он должен работать!

ie;

public WsMessageType type;
public string data;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...