加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

json.net – 使用TypeNameHandling.All处理命名空间更改

发布时间:2020-12-16 19:52:00 所属栏目:百科 来源:网络整理
导读:我设法通过 JSON.net TypeNameHandling将自己变成了一个修复.我正在使用RavenDB存储一个JSON格式的对象,并将JSON.net序列化器的TypeNameHandling设置为true,以处理我已经存在的继承结构. 我需要更改我正在存储的文档的命名空间,所以现在当它被反序列化时,它
我设法通过 JSON.net TypeNameHandling将自己变成了一个修复.我正在使用RavenDB存储一个JSON格式的对象,并将JSON.net序列化器的TypeNameHandling设置为true,以处理我已经存在的继承结构.

我需要更改我正在存储的文档的命名空间,所以现在当它被反序列化时,它会抛出错误“JSON中指定的错误解析”,因为对JSON文档中的类型的引用不再存在.

为了进行某种滚动迁移,是否有可能拦截Json反序列化?

谢谢,

好吧,想出来最后,这是非常简单的.您需要覆盖DefaultSerializationBinder,它负责从文档中创建.Net类型.由于我的json文档中有旧的命名空间,所以我需要拦截该类型的创建来返回正确的类型.我将一个简单的实现放在一起,这样就可以在创建JSON序列化程序时配置“迁移”.
public class NamespaceMigrationSerializationBinder : DefaultSerializationBinder
    {
        private readonly INamespaceMigration[] _migrations;

        public NamespaceMigrationSerializationBinder(params INamespaceMigration[] migrations)
        {
            _migrations = migrations;
        }

        public override Type BindToType(string assemblyName,string typeName)
        {
            var migration = _migrations.SingleOrDefault(p => p.FromAssembly == assemblyName && p.FromType == typeName);
            if(migration != null)
            {
                return migration.ToType;
            }
            return base.BindToType(assemblyName,typeName);
        }
    }

界面在哪里

public interface INamespaceMigration
{
    string FromAssembly { get; }

    string FromType { get; }

    Type ToType { get; }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读