1. 程式人生 > 其它 >Json的序列化與反序列化以及亂入的k_BackingField

Json的序列化與反序列化以及亂入的k_BackingField

  今天需要使用Json資料,所以用到了Json的序列化與反序列化。首先先來說怎麼序列化的:

1.序列化與反序列化

  首先新增System.Runtime.Serialization的引用

Object轉換成Json檔案:

      public static string ObjectToJson(object obj)
        {
            DataContractJsonSerializer ser = new DataContractJsonSerializer(obj.GetType());
            using (MemoryStream ms = new MemoryStream())
            {
                ser.WriteObject(ms, obj);
                return Encoding.Default.GetString(ms.ToArray());
            }
        }

Json資料轉換成Object

    public static T JsonToObject<T>(string json) where T : class
        {
            DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
            using (MemoryStream ms = new MemoryStream(Encoding.Default.GetBytes(json)))
            {
                return (T)ser.ReadObject(ms);
            }
        }

  程式比較簡單我就不多說了,剛開始實體類是這樣的:

  [Serializable]
    class User
    {
        public int Age { get; set; }
        public string Name { get; set; }

        public User(string name, int age)
        {
            Age = age;
            Name = name;
        }
    }

然後呼叫:

    static void Main(string[] args)
        {
            var user1 = new User("zhangsan", 18);
            var users = new List<User> { user1, new User("lisi", 23 ) };
            var strUser1 = ObjectToJson(user1);
            var setUsers = ObjectToJson(users);
        }

加入斷點,檢視json資料,

居然莫名其妙出現了亂入的k__BackingField

2.亂入的k__BackingField的解決方案

從網上找了好多資料也沒搞明白是為啥會出現這個問題。想了解的可以參考下這個。不過找到了解決方案,這裡記錄下:

只需要將實體類改成如下形式:

  [DataContract]
    class User
    {
        [DataMember]
        public int Age { get; set; }
        [DataMember]
        public string Name { get; set; }

        public User(string name, int age)
        {
            Age = age;
            Name = name;
        }
    }

再監視下就不會出現k__BackingField。Json資料轉換成實體的呼叫也很簡單:

static void Main(string[] args)
        {
            var user1 = new User("zhangsan", 18);
            var users = new List<User> { user1, new User("lisi", 23 ) };
            var strUser1 = ObjectToJson(user1);
            var strUsers = ObjectToJson(users);

            var user11 = JsonToObject<User>(strUser1);
            var users1 = JsonToObject<List<User>>(strUsers);
        }