- - PR -
データ構造を変更した場合のデシリアライズ(既出ですが...)
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-01-13 19:00
超々初心者です。
データ構造を変更した場合のデシリアライズについて質問です。 最初あるクラスをシリアライズしたとします。 その時は、メンバー変数は10個定義していました。 後日、そのクラスのメンバー変数に2個追加した場合、 デシリアライズで以下のエラーとなります。 『バージョンが一致していない可能性があります。 型 TDIA_COND.TrainDiaCond は 12 メンバが含まれていますが、 シリアル化が解除されたメンバの数は 10 です。』 エラーから判断して、デシリアライズで前の情報を取得しているためのようですが、 シリアライズするファイルは、毎回新規に作成しています。(BinaryFormatterで) 前の情報はどこに保持されているのでしょうか? ちなみに、シリアイズするファイル名を変更すると (多分、前の情報は存在しないため)このエラーは発生しません。 なので、これで回避してもいいのですが、根本的な解決策ではありませんし... ご教授よろしくお願い致します。 | ||||||||||||
|
投稿日時: 2006-01-13 19:58
既出のスレ主です(笑。
基本的にシリアライズされたものとデシリアライズされたものが違うと駄目です、前回のスレ読めば対応策など分かると思いますが…… データがどこに保存されているなどはバイナリなのでなんとも……一度Soapを使って調べてみるなどをするしかないですかね?(不明。
これを解決策と呼べるのであればエラーを拾ってエラーが発生した場合はデシリアライズを行わないようにすればいいのでは? _________________ 9uiet Design - http://quietdesign.rental.allinoneserver.net/ デザインにこだわったソフトの配布とプログラミングTipsの公開(予定)をしています。 9uiet Blog - http://seiga.blog44.fc2.com/ 笑ったことやプログラミングのことなど書 | ||||||||||||
|
投稿日時: 2006-01-14 10:54
ISerializable を実装してカスタムシリアル化にするのが良いかと。(一般的かどうかは知りませんが)
シリアル化処理を、どう実装しているかによります。つまり、自分で実装しているかどうかです。 SerializableAttribute を付けただけの自動シリアル化にしているときは、「前の情報」なんて物はないでしょう。
これはどういう意味でしょうか? 話の筋からすると、メンバ変数が 10 個のクラスがシリアル化するときのファイル名を変更すると成功する、という事でしょうか? そんな訳ないと思うので、
解決できていないと思うのですが…。 _________________ 囚人のジレンマな日々 | ||||||||||||
|
投稿日時: 2006-01-14 11:05
たぶんファイル名を変更すれば昔のファイルを読み取りに行かないからって意味じゃ無いですか?こんな感じ
このコードで、仕様を変更した後ファイル名も "ahya.hogehoge" にしてしまえばファイルが存在しないから無視…エラーが発生しない(前回の設定を受け継がない) ただ、回避といっているところが気になりますが。 囚人さんも仰られているように ISerializableを実装してやるのがいいのではないでしょうか?前回の siaさんの「アプリケーションのバージョン情報を保存しておき分岐」というのも参考になるのではないでしょうか? または僕みたいにハッシュに突っ込んで楽をするか(相当ファイルサイズ大きくなりますorz 前回の siaさんの発言を見る限りでは .net 2.0にするのが手っ取り早そうですが…… _________________ 9uiet Design - http://quietdesign.rental.allinoneserver.net/ デザインにこだわったソフトの配布とプログラミングTipsの公開(予定)をしています。 9uiet Blog - http://seiga.blog44.fc2.com/ 笑ったことやプログラミングのことなど書 |
1