zoukankan      html  css  js  c++  java
  • 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);
            }
  • 相关阅读:
    86. Partition List
    2. Add Two Numbers
    55. Jump Game
    70. Climbing Stairs
    53. Maximum Subarray
    64. Minimum Path Sum
    122. Best Time to Buy and Sell Stock II
    以场景为中心的产品设计方法
    那些产品经理犯过最大的错
    Axure教程:如何使用动态面板?动态面板功能详解
  • 原文地址:https://www.cnblogs.com/smiler/p/4603074.html
Copyright © 2011-2022 走看看