2012-01-25 6 views
0

データストアに対するクエリの作成に使用される検索条件を表すクラスがあります。このクラスは直列化可能であり、クラスインスタンスをディスクに保存して再読み込みできるため、ビジネスレベルの検索機能を保存して再利用することができます。バイナリシリアライザ - シリアル化されたファイルのシリアライズ可能なクラスの場所の変更

ここに問題があります。私は最近、シリアル化できるクラスの場所を変更しました。私はそのクラスの構造を変更していない、私はただ一つのプロジェクト(もはや元の名前では存在しない)から別のプロジェクトに移した。そうすることで、以前の場所に存在していたクラスに基づいてファイルの非直列化を解除したことに気付きました。

可能であれば、これらのファイルを「変換」できる必要があります。ファイルはバイナリ形式ですが、ファイルの多くは現在無効な名前空間を含むプレーンテキストとして読み込み可能です。しかし、私が見ることができる上記のファイルのテキストを変更するだけで、それは破損するので、明らかに私は何かが欠けている。

何らかのバッチ処理としてファイルを更新する方法や、新しいクラスの場所でシリアライザをポイントする方法があるので、ファイルをデシリアライズすることはできますか?

答えて

1

各名前空間にシリアル化可能なクラスの2つのコピーを持つ小さなプログラムを作成できます。次に、古い名前空間のクラスを使用してファイルからデータを読み取ることができ、各インスタンスについて、すべてのフィールドをコピーする新しい名前空間にクラスのインスタンスを作成します。その後、新しいクラスをファイルにシリアル化することができます。

+0

これは、私も同様にやらなければならないと思っていることです。私はそれがこれに来ないことを望んでいたが、まあまあ。このルートを終えると、私はMarcのアドバイスを受け取り、DataContractのようなテキストベースのシリアル化メソッドに切り替えます。彼が言ったように、シリアライザに見られるような形式がシリアライズされたファイルと一致する限り、オブジェクトがどこにあるかは問題ではありません。 – KeithS

+0

私はこれをやってしまいましたが、ファイルをXMLにシリアライズしました。これらのファイルは新しい場所の同じオブジェクトによって逆シリアル化されます。 – KeithS

0

システムは古いアセンブリに見えたとき、それはタイプを見つけることができないが、それは属性を検索し、新しいアセンブリに再び見えるようにあなたは、TypeForwardedToAttributeを使用することで、この問題を解決することができます。使用方法についてはMSDNを参照してください。ただし、これはBinaryFormatterと同じです。

しかし、protobuf-netなどのコントラクトベースのシリアライザに移行することを強くお勧めします。これは、タイプやメンバーの移転、名前の変更などを気にしません。 BinaryFormatterは... Pricklyです。

+0

残念ながら、私が言及したように、古いライブラリはもはやソリューションには存在しないので、古い場所に「転送先アドレス」を置くことはできません。シリアライザを直接設定する方法があることを期待していたので、古い場所を見ずにフォワーディングを行うことになりました。私はただXMLシリアル化に変換することを考えているので、これが再び変更された場合は、必要な変更を加えてファイルを直接更新できる可能性が高くなります。 – KeithS

+0

@KeithSは、カスタムバインダーを使うことができるかもしれないが、...ハードなもの。古いdllを使用して逆シリアル化を行うことができれば、より簡単になります。 –

関連する問題