2009-09-23 15 views
7

"AssemblyA" adlı bir derlemede "MyClass" adlı bir sınıfım varsa ve .NET'in BinaryFormatter'ı kullanarak bir dosyaya serileştirirseniz. Ardından "AssemblyB" adlı bir derleme "Sınıfım" kodunu taşımak ve aşağıdaki "System.TypeLoadException" istisna almak dosyayı serisini çalıştığınızda:C# Taşınan veya yeniden adlandırılmış bir sınıfı deserialize

derlemesinden tipi 'AssemblyA.MyClass' yüklenemedi ' AssemblyA, Sürüm = 1.0.0.0, Culture = neutral, PublicKeyToken = null '.

Sınıfın AssemblyB'ye taşındığını göstermek için herhangi bir yol var mı? Bir çeşit öznitelikle mi? Veya seri hale getirilmiş dosyayı AssemblyA.MyClass'dan AssemblyB.MyClass'a tüm başvuruları değiştirmek için ön işlem öncesi adım olarak değiştirmek mümkün mü? Son olarak, eğer bu seçeneklerden hiçbiri mümkün değilse, bu sınıftan vazgeçmek için denemeyi atlamak ve yine de verilerin geri kalanını serpiştirmeye devam etmek mümkün mü?

cevap

6

bunu taşınmış, o zaman şimdi bulunduğu dll bir başvuru ekleyin ve TypeForwardedToAttribute kullanın: Bir türe arayan

[assembly:TypeForwardedTo(typeof(TheType))] 

Bu (BinaryFormatter IIRC dahil) bazı istekler için yeterli olacaktır Yeni mecliste bulun. Bununla birlikte, IIRC, yalnızca en dış türler için çalışır (iç içe türler ve muhtemelen jenerik değil), ve yeniden adlandıramaz/isim alanını değiştiremezsiniz/etc

Yeniden adlandırma, hatalar ... BinaryFormatter bu tür şeyler. IMO, sadece sıkı sıkıya bağlı iki sistem arasında geçici veri serileştirmek için uygundur (örneğin, aynı süreçte iki AppDomain s arasındaki değişim, depolama için kullanıldığında veya senkronizasyondan çıkabilen sistemler arasında bir kabus olabilir.

çok geç olabilir, ama ben bir sözleşme bazlı seri hale (yerine bir tür tabanlı seri hale) kullanarak öneriyoruz; (sürece [DataContract]/[DataMember] özelliklerini kullanmak gibi) XmlSerializer herhangi DataContractSerializer vs. Eğer hızlı bir ikili istiyorsanız, protobuf-net iyi bir iş yapardı (ve ihtiyacınız varsa ISerializable'a bağlanabilirsiniz)

Bakmaya değer başka bir kavram, serileştirme süreleridir, ama tha t nispeten serttir. Fakat IIRC bu, size oluşturulan tür üzerinde kontrol sağlar - ancak bunun için bir lot yapmalısınız.

İlgili konular