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

前端之家收集整理的这篇文章主要介绍了json.net – 使用TypeNameHandling.All处理命名空间更改前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我设法通过 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; }
}
原文链接:https://www.f2er.com/json/288443.html

猜你在找的Json相关文章