2012-03-28 11 views
10

JSON.net TypeNameHandlingを使用して自分自身を修正することができました。 RavenDBを使用してJSON形式のオブジェクトを保存し、JSON.netシリアライザのTypeNameHandlingをtrueに設定して、私が使用している継承構造を処理します。TypeNameHandling.Allで名前空間を変更する処理

保存しているドキュメントの名前空間を変更する必要があったため、逆シリアル化されると、JSONドキュメントの型への参照が存在しなくなったため、エラー "JSONで指定された型のエラーを解決しました" 。

何らかのローリングマイグレーションを行うためにJsonのデシリアライズを傍受することは可能ですか?

ありがとう、

答えて

18

よく分かりました。結局、それはかなりストレートでした。ドキュメントから.Netタイプを作成することを担当するDefaultSerializationBinderを上書きする必要があります。私のjsonドキュメントには古い名前空間があるので、正しい型を返すためにその型の作成を傍受する必要がありました。 JSONシリアライザの作成時に「移行」を設定できるようにする簡単な実装をまとめました。インタフェースは

public interface INamespaceMigration 
{ 
    string FromAssembly { get; } 

    string FromType { get; } 

    Type ToType { get; } 
} 
+3

これを接続する方法を知りたい人は、次のようにしてください:documentStore.Conventions.CustomizeJsonSerializer = serializer => serializer.Binder = new NamespaceMigrationSerializationBinder(migrations); – NeilD

+0

これは、RavenDBの名前空間の移行に最適なソリューションです。どうもありがとう!!! – marisks

+0

私はBindToNameも上書きしたいと思うかもしれません、あるいはあなたのセーブに$ type = ""があるかもしれません。あなたは次のようなことができます:public override void BindToName(serializedTypeをタイプし、stringアセンブリ名を出し、typeNameを出力します) { typeName = serializedType.FullName; assemblyName = serializedType.Assembly.FullName; – pomarc

0

これを行うにはDocumentConversionListenerを使用できます。ここをクリックしてください:http://ayende.com/blog/66563/ravendb-migrations-rolling-updates

+0

おかげでダニエルです

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

。しかし、問題はここに来る前に起こります。 IDocumentConversionListenerのインターフェイスを見ると、deserializdedオブジェクトを送信していることがわかります。私の問題は、逆シリアル化に失敗していることです。 –

+0

RavenJObject型のパラメータ 'document'があります。このパラメータは、非直列化される前のjsonツリーです。これにより、オブジェクト/プロパティに逆シリアル化される前にプロパティの値を変更できるようになります。希望を助けること - もしそうでなければ、いくつかのコードを投稿してください。 –

関連する問題