繁体   English   中英

使用 Newtonsoft.Json 进行枚举反序列化

[英]Enum deserialization with Newtonsoft.Json

您好我想反序列化一个 class 并且在这个 class 中是一个枚举值:

[JsonConverter(typeof(StringEnumConverter))]
public enum MessageType {
    Verify, 
    Disconnect,
}

[Serializable]
public class SocketMessage {
    public Dictionary<String, String> Header { get; private set; }
    public MessageType MessageType { get; private set; }

    public SocketMessage(MessageType type) {
        Header = new Dictionary<String, String>();
        MessageType = type;
    }

    public void AddHeaderData(String key, String data) {
        Header.Add(key, data);
    }

    public byte[] ToJSONBytes() {
        String json = JsonConvert.SerializeObject(this);
        return Encoding.UTF8.GetBytes(json);
    }

    public static SocketMessage FromJSONBytes(byte[] json) {
        String s = Encoding.UTF8.GetString(json);
        return JsonConvert.DeserializeObject<SocketMessage>(s);
    }
}

字典将被正确反序列化,但枚举总是得到他的默认值 >verify< json 看起来像这样: {"Header":{"Test":"Test"},"MessageType":"Disconnect"}

我真的不明白为什么会这样

我很感激任何帮助!

由于MessageType属性上的private set ,它无法正常工作。 所以getter是公共的,所以它可以很好地序列化,但是在反序列化时,它被忽略了。 有几个可能的解决方案。

  1. MessageType使用公共设置器。 不过,您可能首先想使用私人二传手是有原因的,所以这可能不适合您。
  2. JsonProperty属性应用于MessageType属性:
[JsonProperty]
public MessageType MessageType { get; private set; }
  1. 将构造函数参数名称更改为messageType而不是type ,使其与序列化名称匹配:
public SocketMessage(MessageType messageType)
{
     Header = new Dictionary<String, String>();
     MessageType = messageType;
}

为什么Header没有问题? 这是因为它是在构造函数中新建的。 构造函数在反序列化中被调用,因此它被设置,然后在字典被反序列化时添加到每个条目。 如果你从构造函数中删除它,你会看到它有同样的问题,反序列化后会是null

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM