DOBON.NET DOBON.NETプログラミング掲示板過去ログ

クラスコンストラクタで逆シリアル化

分類:[.NET]

http://dobon.net/vb/dotnet/file/xmlserializer.html
↑の方法を使って、クラスコンストラクタでクラスを復元したいのですが、

this = (クラス名) serializer.Deserialize(FileStream);

とするとthisは読み取り専用だといわれてうまくいきません。

根本的にやり方が違うのでしょうか。
よろしくお願いします。
■No9763に返信(kさんの記事)

コンストラクタでの処理だからできないのではなく、
デシリアライズだからできないのでもなく・・・
thisキーワードは自インスタンスを指すための特別なポインタで、
他の実体を指すようにすりかえることはできません。
配下のメンバフィールドはもちろん変更可能ですから、一旦仮の変数に
デシリアライズして、ディープコピーの要領でがんばってメンバコピーを
するように記述してください。
(コピーコンストラクタ作る際のように・・・。)
2005/03/14(Mon) 09:43:21 編集(投稿者)

> 配下のメンバフィールドはもちろん変更可能ですから、一旦仮の変数に
> デシリアライズして、ディープコピーの要領でがんばってメンバコピーを
> するように記述してください。
> (コピーコンストラクタ作る際のように・・・。)

そんな面倒なことを考える必要は無いですよ。

public class a {
public static a Deserialize(string filename) {
■■■■
}
}

あとはがんばってみてください。(^^
自クラスのデシリアライズを、コンストラクタで行いたいようなので、
thisに直接オブジェクトを戻すことはできないと言ったまででした。
で、
SerializationInfoからフィールドにデータを戻す処理
(:=「
field1 = (int)info.GetValue("field1", typeof(int));
field2 = (string)info.GetValue("field2", typeof(string));
」とか。)、
延々ずらーっと書く必要がありますよね。
シリアル化インタフェースをきちんと実装した形でコンストラクタでやるにしろ、
単に適当なメソッドでやるにしろ、どこかしらで。
あれのことを、コピーコンストラクタ作る時のように、と表現したまでです。

・・・あれ?違いました?ひょっとして、簡単にできます?



P.S.
・・・継承元クラスの逆シリアル化用コンストラクタって、いつも呼び忘れそうになりませんか。
(私だけ?)
なるほど、こど。さんがおっしゃるようにメンバごとに書かないといけないのかな..。
しかし、変数もかなりあるので、クラスの外からやることも考えてみたりしてます。
調べてみましたが、↓にもかいてありますね。宇宙仮面さんですが。
http://ukamen.hp.infoseek.co.jp/Programming/Serialize/

中さんに教えていただいたことを調べてみたのですが、、情報がみつからず..。
もうすこしヒントをいただけませんか?

よろしくお願いします(__)
kさんは

(クラス名) obj = new (クラス名)();

という感じで使おうと考えているのだろうと思いますが、これをやめて、(クラス名)のクラスに静的メソッド(ここではCreateInstanceとする)を作成し、復元したオブジェクトを返すようにして、

(クラス名) obj = (クラス名).CreateInstance();

のようにできませんか?

DOBON.NET | プログラミング道 | プログラミング掲示板