2012-03-28 53 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