• c# Json Dictionary序列化和反序列化


    说明:Dictionary对象本身不支持序列化和反序列化,需要定义一个继承自Dictionary, IXmlSerializable类的自定义类来实现该功能。感觉完全可以把这样的类封装到C#库中,很具有通用性嘛,至今没有遇到不能用的情况的说,或许出于其他方面的考虑microsoft才没有这么做。

    这里说的是字典的键值是自定义类的情况,其他情况不在讨论范围,所使用的Newtonsoft.Json.dll。

        闲话少说,直接上代码。

    自定义类:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace RedisTest.Test
    {
         [Serializable]
        public class TestClass
        {
            public string Name = "";
            public TestClass(string n)
            {
                Name = n;
            }
            public override bool Equals(object obj)
            {
                TestClass other = obj as TestClass;
                if (other == null)
                    return false;
    
                if (!base.GetType().Equals(obj.GetType()))
                    return false;
    
                return (this.Name.Equals(other.Name));
            }
    
            public override int GetHashCode()
            {
                return Name.GetHashCode();
            }
    
            public static explicit operator TestClass(string jsonString)
            {
                return Newtonsoft.Json.JsonConvert.DeserializeObject<TestClass>(jsonString);
            }
    
            public override string ToString()
            {
                return Newtonsoft.Json.JsonConvert.SerializeObject(this);
            }
    
        }
    }

    测试代表:

    using Newtonsoft.Json;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace RedisTest.Test
    {
        class Program
        {
            static void Main(string[] args)
            {
                Dictionary<TestClass, int> dic = new Dictionary<TestClass, int>();
                TestClass c = new TestClass("c0");
                dic.Add(c, 0);
                TestClass c1 = new TestClass("c1");
                dic.Add(c1, 1);
                TestClass c2 = new TestClass("c2");
                dic.Add(c2, 2);
                TestClass c3 = new TestClass("c3");
                dic.Add(c3, 3);
    
                string json = JsonConvert.SerializeObject(dic, Formatting.Indented);
                Console.WriteLine(json);
                Dictionary<TestClass, int> dic1 = JsonConvert.DeserializeObject<Dictionary<TestClass, int>>(json);
    
            }
        }
    }

     其中重要的是:

            public static explicit operator TestClass(string jsonString)
            {
                return Newtonsoft.Json.JsonConvert.DeserializeObject<TestClass>(jsonString);
            }
    
            public override string ToString()
            {
                return Newtonsoft.Json.JsonConvert.SerializeObject(this);
            }
  • 相关阅读:
    SQL 的单引号转义字符
    Oracle中row_number()、rank()、dense_rank() 的区别
    Hibernate之mappedBy与@JoinColumn
    spring定时任务的注解实现方式
    springmvc常用注解之@Controller和@RequestMapping
    out.print()与out.write()的区别
    idea 中 找不到程序包 的坑
    Thymeleaf学习
    unknow command 'iscan',使用redis desktop manager 无法读取redis存储的数据
    Struts2框架简单介绍
  • 原文地址:https://www.cnblogs.com/zoro-zero/p/6184159.html
Copyright © 2020-2023  润新知