簡體   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