我创建了一个Form,假如为public class myForm:Form,现在我new一个出来:
myForm DyQuery=new myForm();
我想把DyQuery序列化然后保存起来,下次在软件中反序列化一下就可以直接使用了,但序列化时报错:程序集“DyQuery, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”中的类型“DyQuery.frmMain”未标记为可序列化。怎么办啊,如果不能序列化,怎样保存一个form实例呢?

解决方案 »

  1.   

    Form?几乎不可能,除非你遍历它所有的成员直到值类型为止,然后逐一序列化!这就又有一个引用类型互相引用的问题所以几乎不可能
      

  2.   

    没用过,是不是前面少了[Serializable]
      

  3.   

    楼上好像说的对,form不能序列化
      

  4.   

    你可以自己创建一个Form类,让它继承自Windows的Form,同时实现ISerializable接口.看行不行
      

  5.   

    以我的理解,任何对象都可以被序列化的
    我通常使用BinaryFormatter 来二进制对象 用来传输或保存
    参看msdn的BinaryFormatter 里面有完整事例,例子中好像是保存成文件
      

  6.   

    应该只要保存一些窗口中会修改的信息就可以了!
    不用整个Form保存的!
      

  7.   

    如果只序列化其中指定的对象,BinaryFormatter 就可以了
      

  8.   

    只需要序列化一些属性,将来能够重建该form就可以了。
    微软不会让你把它的控件序列化的。
      

  9.   

    如果没有记错的话,Form是不允许序列化的..可以换种思路:写一个参数类,将Form的一些关键属性存储到这个参数类中,序列化这个参数类..反序列化后,new 一个Form,然后将反序列化得到的相关属性赋值给这个Form对象..仅供参考..
      

  10.   

    你可以参考一下sharpdevelop中的窗口序列化
      

  11.   

    非常感谢大家的回答,其实我是碰到了一个难题,由于要定制许多查询,而这些查询需要的参数又是未知的(根据用户需求,不定时增加或者修改),我想了一个办法,创建一个派生于form的类,假如为QueryFormBase,在里面写一些接口,点了里面的OK按钮后,返回一个Sql语句.然后新建一个工程,根据用户的需求,从QueryFormBase派生出一些窗口,将该窗口new一个出来,序列化后保存到服务器上,客户端得到一个序列化的二进制,然后转换为QueryFormBase(不是工程中创建的类,因为客户端根本不知道新创建的类的结构),这样就可以使用了,同时,又无需频繁的升级客户端(虽然客户端软件能自动升级),也就是如果要新增一种未知的查询(所有查询条件最后都返回一个sql语句,由客户端根据该语句查询一个表并显示出来),只需要从QueryFormBase派生一个新的窗口,并添加一些控件、判断之类,然后new一个,并上传到服务器上就行了,客户端使用时,会自动将其转换为基类使用,解决了频繁升级客户端的难题.
    结贴.
      

  12.   

    序列化一个类,不能序列化它的函数。对于form来说,InitializeComponent函数的执行决定了它的布局,基本属性。就算有相同的控件集合,控件属性也一致,没有添加到form上,或者位置,锚定等等不一样(在InitializeComponent里执行),也相去甚远。这样反序列化出来能达到预期目的吗。