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; }
}

相关文章

AJAX是一种基于JavaScript和XML的技术,能够使网页实现异步交...
在网页开发中,我们常常需要通过Ajax从后端获取数据并在页面...
在前端开发中,经常需要循环JSON对象数组进行数据操作。使用...
AJAX(Asynchronous JavaScript and XML)是一种用于创建 We...
AJAX技术被广泛应用于现代Web开发,它可以在无需重新加载页面...
Ajax是一种通过JavaScript和HTTP请求交互的技术,可以实现无...