2012-03-28 71 views
10

我设法让自己进入JSON.net TypeNameHandling的修复。我正在使用RavenDB存储JSON格式的对象,并将JSON.net序列化程序的TypeNameHandling设置为true,以便处理我已有的继承结构。使用TypeNameHandling处理名称空间更改

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

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

谢谢,

回答

18

好吧,算出来。最后它非常简单。您需要覆盖负责从文档创建.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; } 
} 
+3

对于那些想知道如何挂钩它,它是这样的:documentStore.Conventions.CustomizeJsonSerializer = serializer => serializer.Binder = new NamespaceMigrationSerializationBinder(migrations); – NeilD 2013-12-16 11:17:49

+0

这是RavenDB中名称空间迁移的绝佳解决方案。非常感谢!!! – marisks 2014-08-18 21:06:19

+0

我想你可能也想重写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

0

您可以使用DocumentConversionListener来执行此操作。请看看这里:http://ayende.com/blog/66563/ravendb-migrations-rolling-updates

+0

感谢丹尼尔。但问题发生在它能够到达之前。如果您查看IDocumentConversionListener的接口,您将看到它正在发送反序列化的对象。我的问题是它在反序列化上失败了。 – 2012-03-28 19:55:09

+0

您有一个RavenJObject类型的参数'document',它是反序列化之前的json树。这应该使您能够在将属性反序列化为对象/属性之前更改该属性的值。希望有帮助 - 如果没有,请张贴一些代码。 – 2012-03-29 05:37:30