当前位置: 首页 > news >正文

使用 Newtonsoft.Json 序列化 WPF 的 DependencyObject

为什么80%的码农都做不了架构师?>>>   hot3.png

Newtonsoft.Json 是目前最常用的序列化对象方式,但对于 WPF 的 DependencyObject 确有些麻烦,今天这里提供一个转换类源代码方便大家。

有了这个简单的转换类,就可以很简单的直接序列化/反序列化 DependencyObject 基类的各种对象了。

    class DependencyObjectJsonConverter : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            return typeof(DependencyObject).IsAssignableFrom(objectType);
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            var obj = objectType.GetConstructor(Type.EmptyTypes).Invoke(null);
            while (reader.Read() && reader.TokenType == JsonToken.PropertyName)
            {
                var pn = (string)reader.Value;
                var prop = objectType.GetProperty(pn);
                if (prop == null || !prop.CanWrite || prop.DeclaringType == typeof(DependencyObject) || prop.DeclaringType == typeof(DispatcherObject))
                {
                    reader.Skip();
                    continue;
                }
                reader.Read();
                prop.SetValue(obj, serializer.Deserialize(reader, prop.PropertyType));
            }
            return obj;
        }

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            if (value == null)
            {
                writer.WriteNull();
                return;
            }
            writer.WriteStartObject();
            foreach(var prop in value.GetType().GetProperties())
            {
                if (!prop.CanRead || prop.DeclaringType == typeof(DependencyObject) || prop.DeclaringType == typeof(DispatcherObject))
                    continue;
                var val = prop.GetValue(value);
                if(val != null)
                {
                    writer.WritePropertyName(prop.Name);
                    serializer.Serialize(writer, val);
                }
            }
            writer.WriteEndObject();
        }
    }

转载于:https://my.oschina.net/jock/blog/1828838

相关文章:

  • QQ聊天实录:本年度最动人的爱情故事
  • 手机文件误删除,要怎样恢复?
  • HtmlAttribute HTML属性处理类
  • 当无人编辑坐镇新闻编辑部?未来人机社会共存指南
  • 两个listbox实现选项的添加删除和搜索
  • $jQuery 重写Alert样式方法
  • unbunt的svn重启动命令
  • JQ实现购物车价格计算
  • Android UI开发第二十九篇——Android中五种常用的menu(菜单)
  • 安装配置资产管理软件GLPI
  • 走得不是很前但还是走在时代尖端
  • 一行python 生成终端二维码
  • Node.js 0.8.22 稳定版发布
  • SLAM技能树
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • extract-text-webpack-plugin用法
  • k个最大的数及变种小结
  • python3 使用 asyncio 代替线程
  • Rancher-k8s加速安装文档
  • spring boot下thymeleaf全局静态变量配置
  • 从0实现一个tiny react(三)生命周期
  • 对象管理器(defineProperty)学习笔记
  • 前端js -- this指向总结。
  • 如何编写一个可升级的智能合约
  • 移动端 h5开发相关内容总结(三)
  • 【干货分享】dos命令大全
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • C# - 为值类型重定义相等性
  • Java数据解析之JSON
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • #Linux(Source Insight安装及工程建立)
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (10)ATF MMU转换表
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (26)4.7 字符函数和字符串函数
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • ***原理与防范
  • .axf 转化 .bin文件 的方法
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .net6Api后台+uniapp导出Excel
  • .NET基础篇——反射的奥妙
  • @Bean注解详解
  • [2017][note]基于空间交叉相位调制的两个连续波在few layer铋Bi中的全光switch——
  • [DevOps云实践] 彻底删除AWS云资源