10

最近、コードの一部を別のプロジェクト ライブラリに移動しました。

残念ながら、これらのデータはデータベースにシリアル化されているBinaryFormatterようです (理由は聞かないでください。私にはわかりません。この考えは嫌いです)。

今、私はデータベースを更新する更新ツールを作成する責任があります (ツールは、バージョンに基づいて更新が必要なデータベースを検出すると、ソフトウェアによって自動的に起動されます):

  1. 新しい列を作成する
  2. バイナリ列を逆シリアル化します
  3. 逆シリアル化された列を新しい列に書き込みます
  4. 古いバイナリ列を削除します

私の問題は、逆シリアル化しようとすると、次のように表示されることです。

Unable to find assembly 'MyOldAssemblyName, Version=2.0.0.0, Culture=neutral, PublicKeyToken=a5b9cb7043cc16da'.

しかし、このアセンブリはもう存在しません。このクラスを「アップデーター」プロジェクトに入れることに問題はありませんが、このファイルを含むためだけにこの古いプロジェクトを保持する方法はありません。

指定されたクラスで受信したストリームを逆シリアル化する必要があることを BinaryFormatter に指定する方法はありますか?

または、アセンブリの名前が変更されたと言うか、または???

4

3 に答える 3

7

型がアセンブリ間で移動したこと (ただし、古い名前と名前空間は保持されていること) を伝えるために、 (古いアセンブリで)を使用できる場合があります[assembly:TypeForwardedTo(typeof(TheType))]。ここでの「時々」は、を使用する必要があるためですtypeof。これは、古いアセンブリから新しいアセンブリへの参照が必要であることを意味します。これは常に可能であるとは限りませんが、多くの場合 (特に UI レイヤーから型を移動する場合) UI は通常 POCO/DTO を参照するため、POCO/DTO レイヤーにダウンダウンします)。

ただし、変更された名前空間のタイプの名前を変更した場合は、カスタムの「バインダー」を作成する必要があります (こちらを参照)。

BinaryFormatterは本質的に型ベースのシリアライザーであり、コードのバージョン管理やリファクタリングを行うと、常に多くの問題が発生することに注意してください。タイプが「一度書いたら決して変更しない」ではない場合は、より柔軟なもの、つまりタイプベースではなくコントラクトベースのものを使用することを強くお勧めします。基本的に、 (または)以外のほぼすべて: 、、protobuf-net、Json.NET などはすべて問題なく、型を再配置または名前変更してもかまいません。BinaryFormatterNetDataContractSerializerXmlSerializerDataContractSerializer

于 2013-10-21T09:22:03.637 に答える
5

実際、私は自分自身で解決策を見つけたと思います。

SerializationBinderストリームで見つかったクラスを手動で解決できるバイナリ フォーマッタにaを指定できます。

詳細はこちら

于 2013-10-21T09:25:17.567 に答える