- PR -

データ構造を変更した場合のデシリアライズ(既出ですが...)

1
投稿者投稿内容
C#初心者
会議室デビュー日: 2005/12/08
投稿数: 10
投稿日時: 2006-01-13 19:00
超々初心者です。

データ構造を変更した場合のデシリアライズについて質問です。

最初あるクラスをシリアライズしたとします。
その時は、メンバー変数は10個定義していました。

後日、そのクラスのメンバー変数に2個追加した場合、
デシリアライズで以下のエラーとなります。
 『バージョンが一致していない可能性があります。
 型 TDIA_COND.TrainDiaCond は 12 メンバが含まれていますが、
 シリアル化が解除されたメンバの数は 10 です。』

エラーから判断して、デシリアライズで前の情報を取得しているためのようですが、
シリアライズするファイルは、毎回新規に作成しています。(BinaryFormatterで)
前の情報はどこに保持されているのでしょうか?

ちなみに、シリアイズするファイル名を変更すると
(多分、前の情報は存在しないため)このエラーは発生しません。
なので、これで回避してもいいのですが、根本的な解決策ではありませんし...

ご教授よろしくお願い致します。




清華
ベテラン
会議室デビュー日: 2005/12/21
投稿数: 50
投稿日時: 2006-01-13 19:58
既出のスレ主です(笑。

基本的にシリアライズされたものとデシリアライズされたものが違うと駄目です、前回のスレ読めば対応策など分かると思いますが……

データがどこに保存されているなどはバイナリなのでなんとも……一度Soapを使って調べてみるなどをするしかないですかね?(不明。

引用:

ちなみに、シリアイズするファイル名を変更すると
(多分、前の情報は存在しないため)このエラーは発生しません。
なので、これで回避してもいいのですが、根本的な解決策ではありませんし...


これを解決策と呼べるのであればエラーを拾ってエラーが発生した場合はデシリアライズを行わないようにすればいいのでは?
_________________
9uiet Design - http://quietdesign.rental.allinoneserver.net/
デザインにこだわったソフトの配布とプログラミングTipsの公開(予定)をしています。
9uiet Blog - http://seiga.blog44.fc2.com/
笑ったことやプログラミングのことなど書
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-01-14 10:54
ISerializable を実装してカスタムシリアル化にするのが良いかと。(一般的かどうかは知りませんが)

引用:

前の情報はどこに保持されているのでしょうか?


シリアル化処理を、どう実装しているかによります。つまり、自分で実装しているかどうかです。
SerializableAttribute を付けただけの自動シリアル化にしているときは、「前の情報」なんて物はないでしょう。

引用:

ちなみに、シリアイズするファイル名を変更すると
(多分、前の情報は存在しないため)このエラーは発生しません。


これはどういう意味でしょうか?
話の筋からすると、メンバ変数が 10 個のクラスがシリアル化するときのファイル名を変更すると成功する、という事でしょうか?
そんな訳ないと思うので、
引用:

なので、これで回避してもいいのですが、根本的な解決策ではありませんし...


解決できていないと思うのですが…。

_________________
囚人のジレンマな日々
清華
ベテラン
会議室デビュー日: 2005/12/21
投稿数: 50
投稿日時: 2006-01-14 11:05
引用:

これはどういう意味でしょうか?
話の筋からすると、メンバ変数が 10 個のクラスがシリアル化するときのファイル名を変更すると成功する、という事でしょうか?
そんな訳ないと思うので、


たぶんファイル名を変更すれば昔のファイルを読み取りに行かないからって意味じゃ無いですか?こんな感じ

コード:
Setting s;
const string filename = "ahya.hoge";
if(File.Exists(filename))
{
    BinaryFormatter f = new BinaryFormatter();
    using(FileStream fs = new FileStream(filename,FileMode.Open))
    {
        s = (Setting)f.Deserialize(fs);
    }
}
else
{
    s = new Setting();
}


このコードで、仕様を変更した後ファイル名も "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

スキルアップ/キャリアアップ(JOB@IT)