2012-03-28 7 views
10

ile ad alanı değişikliklerini işleme Özümü JSON.net TypeNameHandling ile düzeltmeyi başardım. RavenDB kullanarak JSON biçimlendirilmiş bir nesne saklıyorum ve yerinde sahip olduğum bir kalıtım yapısı ile başa çıkmak için JSON.net serializer'ın TypeNameHandling değerini true olarak ayarladım.TypeNameHandling.All

Kaydetmekte olduğum belgenin ad alanını değiştirmem gerekiyordu, bu nedenle şimdi bir seri hale getirildiğinde, JSON belgesindeki başvuru referansı artık mevcut olmadığından "JSON içinde belirtilen tür hata çözme" hatası veriyor .

o göç haddeleme çeşit yapmak için Json deserialization yolunu kesmek mümkün mü? Bir DocumentConversionListener kullanabilirsiniz

cevap

18

, bunu anladım. Sonunda oldukça düz ileri oldu. Belgeden .Net türünü oluşturmaktan sorumlu olan DefaultSerializationBinder'u geçersiz kılmanız gerekir. Json belgesindeki eski ad alanı olduğundan, doğru türde dönmek için bu türün oluşturulmasını engellemeliydim. JSON serileştiricisi oluşturulduğunda "geçişleri" yapılandırmanıza izin verecek basit bir uygulamayı bir araya getirdim. arayüz

public interface INamespaceMigration 
{ 
    string FromAssembly { get; } 

    string FromType { get; } 

    Type ToType { get; } 
} 
+3

: documentStore.Conventions.CustomizeJsonSerializer = serializer => serializer.Binder = new NamespaceMigrationSerializationBinder (geçişler); – NeilD

+0

Bu, RavenDB'deki ad alanı geçişi için harika bir çözümdür. Çok teşekkürler!!! – marisks

+0

Sanırım BindToName'i de geçersiz kılmak isteyebilirsiniz, aksi halde tasarruflarınız $ type = "" değerine sahip olabilir. Şöyle bir şey yapabilirsiniz: public geçersiz kılma void BindToName (Type serializedType, dize assemblyName dışında, string typeName) { typeName = serializedType.FullName; assemblyName = serializedType.Assembly.FullName; – pomarc

0

sayesinde bunu yapmak için. Burada bir göz atın: http://ayende.com/blog/66563/ravendb-migrations-rolling-updates Tamam

+0

Teşekkür Daniel

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

. Ama sorun, buraya gelmeden önce gerçekleşir. IDocumentConversionListener arabirimine bakarsanız, deserializded nesneyi gönderdiğinizi görürsünüz. Benim sorunum, serileştirme üzerinde başarısız olmasıdır. –

+0

Serileştirilmeden önce json ağacı olan RavenJObject türünde 'document' parametresine sahipsiniz. Bu, nesnenin/özelliğin içine serileştirilmeden önce mülkün değerini değiştirebilmenizi sağlar. Umarım yardımcı olur - eğer değilse, lütfen bazı kodları gönderin. Bunun nasıl bağlanacağını merak edenler için –