好吧,算出来。最后它非常简单。您需要覆盖负责从文档创建.Net类型的DefaultSerializationBinder
。由于我的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; }
}
对于那些想知道如何挂钩它,它是这样的:documentStore.Conventions.CustomizeJsonSerializer = serializer => serializer.Binder = new NamespaceMigrationSerializationBinder(migrations); – NeilD 2013-12-16 11:17:49
这是RavenDB中名称空间迁移的绝佳解决方案。非常感谢!!! – marisks 2014-08-18 21:06:19
我想你可能也想重写BindToName,或者你的保存可能有一个$ type =“”。你可以这样做:public override void BindToName(Type serializedType,out string assemblyName,out string typeName) { typeName = serializedType.FullName; assemblyName = serializedType.Assembly.FullName; – pomarc 2017-12-27 16:47:51