首页 > 解决方案 > C#。来自 JSON 的不正确的反序列化 bool 和 enum

问题描述

bool我用和enum变量序列化一个对象。

        public static void task_1()
        {          
            var _data = new Struct_Task_1()
            {
                _tmp_faucet_1 = StateFaucet.CLOSE,
                _tmp_faucet_2 = StateFaucet.CLOSE,
                _tmp_faucet_6 = false,
                _tmp_faucet_4 = StateFaucet.CLOSE,
                _tmp_faucet_4p = false,
                _tmp_faucet_11 = false,
                _tmp_faucet_11p = false,
                _tmp_faucet_12 = StateFaucet.CLOSE,
                _tmp_faucet_12p = false,
                _tmp_faucet_SK = StateFaucet.CLOSE,
                _tmp_faucet_TRK = StateFaucet.CLOSE,
                _tmp_faucet_EMKV = StateFaucet.CLOSE,  

                _tmp_faucet_5 = StateFaucet.OPEN,
                _tmp_faucet_10 = true,
                _tmp_faucet_9 = true,
                _tmp_faucet_3 = StateFaucet.OPEN,
                _tmp_faucet_3_ap = StateFaucet.OPEN,
                _tmp_faucet_BBK_1 = StateFaucet.OPEN,
                _tmp_faucet_BBK_2 = StateFaucet.OPEN
            };

            using (StreamWriter file = File.CreateText("path.txt"))
            {
                JsonSerializer serializer = new JsonSerializer();
                serializer.Serialize(file, _data);
            }  
        }

这里反序列化代码:

    public class Serialization
    {
        private string path;

        protected Serialization(string path)
        {
            this.path = path;
        }

        protected void SerializeTask<T>(ref T StartVariables)
        {
            string contents = File.ReadAllText(path);
            StartVariables = JsonConvert.DeserializeObject<T>(contents);
        }
    }

    public class Struct_Task_1 : Serialization
    {
        public Struct_Task_1() : base("") { }
        public Struct_Task_1(string path) : base(path) { }

        public void Serialize(Struct_Task_1 s)
        {
            SerializeTask(ref s);
        }

        #region parameters

        public StateFaucet _tmp_faucet_1 { get; set;}
        public StateFaucet _tmp_faucet_2 { get; set;}
        public StateFaucet _tmp_faucet_4 { get; set;}
        public StateFaucet _tmp_faucet_12 { get; set;}
        public StateFaucet _tmp_faucet_5 { get; set;}
        public StateFaucet _tmp_faucet_3 { get; set;}
        public StateFaucet _tmp_faucet_3_ap { get; set;}
        public bool _tmp_faucet_6 { get; set;}
        public bool _tmp_faucet_4p { get; set;}
        public bool _tmp_faucet_11 { get; set;}
        public bool _tmp_faucet_11p { get; set;}
        public bool _tmp_faucet_12p { get; set;}
        public bool _tmp_faucet_10 { get; set;}
        public bool _tmp_faucet_9 { get; set;}
        public StateFaucet _tmp_faucet_SK { get; set;}
        public StateFaucet _tmp_faucet_TRK { get; set;}
        public StateFaucet _tmp_faucet_EMKV { get; set;}
        public StateFaucet _tmp_faucet_BBK_1 { get; set;}
        public StateFaucet _tmp_faucet_BBK_2 { get; set;}

        #endregion    
    }

枚举:

[DataContract]
    /// <summary>
    /// Состояние крана
    /// </summary>
    public enum StateFaucet
    {
        [EnumMember]
        /// <summary>
        /// Открыто
        /// </summary>    
        OPEN = 0,
        [EnumMember]
        /// <summary>
        /// Закрыто
        /// </summary>
        CLOSE = 1,
        [EnumMember]
        /// <summary>
        /// Промежуточное состояние
        /// </summary>
        MID = 2,
        [EnumMember]
        /// <summary>
        /// Сломано
        /// </summary>    
        CRASH = 3
    }

序列化后我有这个字符串:

{
    "_tmp_faucet_1":1,
    "_tmp_faucet_2":1,
    "_tmp_faucet_4":1,
    "_tmp_faucet_12":1,
    "_tmp_faucet_5":0,
    "_tmp_faucet_3":0,
    "_tmp_faucet_3_ap":0,
    "_tmp_faucet_6":false,
    "_tmp_faucet_4p":false,
    "_tmp_faucet_11":false,
    "_tmp_faucet_11p":false,
    "_tmp_faucet_12p":false,
    "_tmp_faucet_10":true,
    "_tmp_faucet_9":true,
    "_tmp_faucet_SK":1,
    "_tmp_faucet_TRK":1,
    "_tmp_faucet_EMKV":1,
    "_tmp_faucet_BBK_1":0,
    "_tmp_faucet_BBK_2":0
}

但是在我反序列化这个字符串的地方,我得到了不正确的

标签: c#json

解决方案


我找到解决方案。我错过refSerialize(Struct_Task_1 s)方法。

public void Serialize(ref Struct_Task_1 s)
{
   SerializeTask(ref s);
}

重新定义后变量s未保存。ref帮助保存新值。


推荐阅读