- PR -

逆シリアル化について

1
投稿者投稿内容
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2004-08-31 18:32
お世話になっております。
VS2003, VB.NETで開発しております。

System.Runtime.Serialization.IDeserializationCallback.OnDeserialization
についての質問なのですが、
A,B,Cの3つのインスタンスがあり
A-B-C
のようにAはBを集約、BはCを集約しています。
A,B,CともにIDeserializationCallback,ISerializableを実装しています。

やりたいことはAのクラスの逆シリアル化が終了した時点(B,Cも逆シリアル化済み)
で、ある処理を実行したいのですが。

OnDeserializationの呼ばれる順番が
A -> B -> C
の順番で呼ばれてしまします。
C-> B -> A
で呼ばれるのを期待していたのですが。。。

Aからみて全ての属性が逆シリアル化された時に処理する方法はないものでしょうか?
よろしくお願いします。


mei
大ベテラン
会議室デビュー日: 2003/04/08
投稿数: 114
投稿日時: 2004-08-31 21:57
こんばんは、meiです。

引用:

burton999さんの書き込み (2004-08-31 18:32) より:

Aからみて全ての属性が逆シリアル化された時に処理する方法はないものでしょうか?
よろしくお願いします。



OnDeserializationが呼ばれる順番はA->B->Cになっていますが、
AのOnDeserializationが呼ばれるタイミングで逆シリアル化は完了しているのではないでしょうか?

C#で申し訳ないですが、以下、実験コードです。
コード:
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

[Serializable]
public class A : IDeserializationCallback {
	public string name;
	public B b = new B();
	public void OnDeserialization(object sender) {
		Console.WriteLine("A:" + name);
		Console.WriteLine("A:" + b.name);
		Console.WriteLine("A:" + b.c.name);
	}
}

[Serializable]
public class B : IDeserializationCallback {
	public string name;
	public C c = new C();
	public void OnDeserialization(object sender) {
		Console.WriteLine("B:" + name);
		Console.WriteLine("B:" + c.name);
	}
}

[Serializable]
public class C : IDeserializationCallback {
	public string name;
	public void OnDeserialization(object sender) {
		Console.WriteLine("C:" + name);
	}
}

class Program {
	[STAThread]
	static void Main(string[] args) {
		A a = new A();
		a.name = "aa";
		a.b.name = "bb";
		a.b.c.name = "cc";

		using (FileStream fs = File.Create("a.bin")) {
			BinaryFormatter bf = new BinaryFormatter();
			bf.Serialize(fs, a);
			a = null;
			fs.Position = 0;
			a = bf.Deserialize(fs) as A;
		}
	}
}

/* 結果
A:aa
A:bb
A:cc
B:bb
B:cc
C:cc
*/


AのOnDeserializationでメンバb及びb.cの値が取得出来ています。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2004-09-01 11:20
mei様レスありがとうございます。

たしかにAのOnDeserializationが呼ばれる時はB,Cの逆シリアル化が完了しているのですが
B,CのOnDeserializationが呼ばれた後に、Aで処理を行いたいと思っております。
言葉が足らなくて申し訳ありませんm(__)m
A,B,Cはそれぞれ双方向参照しているので、OnDeserializationで参照の設定をしております。


1

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