[Serializable()]
public class myPanel : Panel ,ISerializable
{
public myPanel(SerializationInfo info,StreamingContext text)
{
SerializationInfoEnumerator ie = info.GetEnumerator();
while(ie.MoveNext())
{
object o = ie.Value;
if (o is Control)
{
this.Controls.Add((Control)o);
//运行到上一句出错:
//未处理的“System.Reflection.TargetInvocationException”
//类型的异常出现在 mscorlib.dll 中
}
}
}
public void GetObjectData(SerializationInfo info,StreamingContext text)
{
foreach(Control c in Controls)
{
Type t = c.GetType();
if (t.GetInterface("ISerializable")!= null)
{
info.AddValue( c.Name ,c );
}
}
}
public myPanel() : base()
{
}
}
---------------------------------------------------------------
关注
---------------------------------------------------------------
建议发到微软public的新闻组,
---------------------------------------------------------------
在Deseriailization过程中,系统调用你的special constructor的时候只是保证所有对象的引用关系都设置正确,但是不保证所有对象的成员都适当的初始化了。因此,这时候通常还不能正常的使用对象(调用其方法或者将其作为参数),只能暂时保存它的引用,在Deserialization结束之后在进一步处理(通过IDeserializationCallback)。
[Serializable()]
public class myPanel : Panel ,ISerializable,IDeserializationCallback
{
[NonSerializable]
private SerializationInfo _deinfo; //供Deserialization使用
public myPanel(SerializationInfo info,StreamingContext text)
{
_deinfo = info;
}
......
void IDeserializationCallback.OnDeserialization(Object sender) {
SerializationInfoEnumerator ie = _deinfo.GetEnumerator();
while(ie.MoveNext())
{
object o = ie.Value;
if (o is Control)
{
this.Controls.Add((Control)o);
}
}
}
....
}