当对 formatter 调用 Serialize 方法时,根据以下规则对象序列化继续进行: 进行检查以确定格式化程序是否具有代理选择器 — 如果它没有,则检查该代理选择器是否处理给定类型的对象。选择器处理该对象类型,对该代理选择器调用 ISerializable.GetObjectData。 
如果没有代理选择器或者如果它不处理该类型,则进行检查以确定是否用 Serializable 属性标记了该对象。如果没有标记,则引发 SerializationException。 
如果适当标记了它,则检查该对象是否实现 ISerializable。如果没有实现,则对该对象调用 GetObjectData。 
如果它没有实现 ISerializable,则使用默认的序列化策略,同时序列化未标记为 NonSerialized 的所有字段。

解决方案 »

  1.   

    好像你序列化的控件是一个你自定义的控件。因为错误的原因是你没有一个可被序列化管理器调用的构造函数,而序列化管理器调用的是默认的构造函数。而所有的windows控件都有默认的构造函数。所以你需要给你的控件加上一个默认的构造函数,很简单,就是一个没有参数的,也没有内容的构造函数。然后确信你的控件的class已被标志为Serializable
      

  2.   

    序列化的类
    [Serializable()]
    public class Test:ISerializable
    {
    public int i;
    int j;
    string k; public Test()
    {
    i = 20;
    j = 30;
    k = "Hello World";
    } public Test(SerializationInfo info, StreamingContext context)
    {
    info.GetValue("tst",typeof(int));
    } public void GetObjectData(SerializationInfo ifo, StreamingContext context)
    {
    ifo.AddValue("tst",i);
    }
    }
    }// 序列化与反序列化代码
    private void button1_Click(object sender, System.EventArgs e)
    {
    Test tt = new Test();
    tt.i = 5600;
    // Opens a file and serializes the object into it in binary format.
    Stream stream = File.Open("MyClass1MyClass2.bin", FileMode.Create);
    BinaryFormatter bformatter = new BinaryFormatter(); bformatter.Serialize(stream, tt);
    stream.Close(); } private void button2_Click(object sender, System.EventArgs e)
    {
    Test ttt;
    Stream stm = File.Open("MyClass1MyClass2.bin",FileMode.Open);
    BinaryFormatter bf = new BinaryFormatter();
    ttt = (Test)bf.Deserialize(stm);
    stm.Close(); MessageBox.Show(ttt.i.ToString());
    }写得不好,请多指教了
      

  3.   

    为什么报错error Reflecting ??
      

  4.   

    winform,webform 控件能否序列化?