我设法通过JSON.net TypeNameHandling让我的自我修复.我使用RavenDB存储JSON格式的对象,并将JSON.net序列化程序的TypeNameHandling设置为true,以便处理我已有的继承结构.
我需要更改我正在存储的文档的命名空间,所以现在当它被反序列化时,它会抛出错误"在JSON中指定的错误解析类型",因为对JSON文档中的类型的引用不再存在.
是否有可能拦截Json反序列化以进行某种滚动迁移?
谢谢,
Ros*_*nes 21
好吧,想通了.最后它非常直接.您需要覆盖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);
}
}
Run Code Online (Sandbox Code Playgroud)
界面在哪里
public interface INamespaceMigration
{
string FromAssembly { get; }
string FromType { get; }
Type ToType { get; }
}
Run Code Online (Sandbox Code Playgroud)