winform程序:一个panel,里面保存很多控件,有各自的基本属性,当点击“保存”按钮时希望能保存当前panel和里面的所有控件,保存成一个单个文件;当点击“打开”按钮时打开这个单个文件,将保存的状态全部反射回来。
最好有实例,谢谢!!!

解决方案 »

  1.   

    没有试过,你把整个窗体,实例化后,再把它用XmlSerializer 序列化,生成一个xml文件自己分析一下么, 
      

  2.   

    http://www.cnblogs.com/thx-bj/archive/2008/05/28/1208777.html
      

  3.   

    这种做法其实是不行的。因为Windows Controls都是上下文相关的对象,这就违背了序列化、反序列化的思想。为什么?因为序列化、反序列化的主要目的就是数据重建与传输。
    1、数据重建上的问题:由于是上下文相关的,例如句柄等信息,重建后的句柄数据是没有意义的。
    2、传输上的问题:比如你序列化了一个Form,然后传到另一台机器上试图反序列化,由于两台机器环境可能不同(比如句柄已被分配),此时反序列化后的对象会有很多数据是“无效”的
    因此,在做remoting的时候你会发现,事实上窗体根本没法通过网络传输。传统的做法就是把Form中你所关心的那些属性抽出来,另外定义一个类,在序列化的时候逐个赋值到这个类中的属性,然后序列化这个类。
    或者还有一种高级的做法,就是使用CodeDom。就如2楼给出的那个链接里所述。
      

  4.   

    首先,System.Window.Form就没有可序列化标签~
      

  5.   


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Web;
    using System.Web.Script.Serialization;
    using System.Xml.Serialization;
    using System.IO;
    using System.Runtime.Serialization;
    using System.Runtime.Serialization.Formatters.Binary;
    using System.Runtime.Serialization.Formatters.Soap;namespace Common
    {
        public class SerializableClass
        {        #region Json序列化
            
            public static void ObjectToJson(object obj, string FilePath)
            {
                JavaScriptSerializer _JavaScriptSerializer = new JavaScriptSerializer();
                string SerializableStr= _JavaScriptSerializer.Serialize(obj);
                File.WriteAllText(FilePath, SerializableStr);
            }        public static object JsonToObject(string FilePath)
            {
                StreamReader streamReader = new StreamReader(FilePath); 
                JavaScriptSerializer _JavaScriptSerializer = new JavaScriptSerializer();
                return _JavaScriptSerializer.DeserializeObject(streamReader.ReadToEnd());
            }        #endregion        #region Xml序列化        public static void ObjectToXml(object obj,string FilePath)
            {
                XmlSerializer _XmlSerializer = new XmlSerializer(obj.GetType());
                StreamWriter _StreamWriter = new StreamWriter(FilePath);
                _XmlSerializer.Serialize(_StreamWriter, obj);
            }        public static object XmlToObject(Type _Type, string FilePath)
            {
                XmlSerializer _XmlSerializer = new XmlSerializer(_Type);
                FileStream _FileStream = new FileStream(FilePath, FileMode.Open);
                return _XmlSerializer.Deserialize(_FileStream);
            }        #endregion        #region 二进制序列化        public void ObjectToBin(object obj, string FilePath)
            {
                IFormatter formatter = new BinaryFormatter();
                using (FileStream _FileStream = new System.IO.FileStream(FilePath, 
                    System.IO.FileMode.Create, 
                    System.IO.FileAccess.Write, 
                    System.IO.FileShare.None
                    ))
                {
                    _FileStream.Position = 0;
                    _FileStream.Seek(0, SeekOrigin.Begin);
                    formatter.Serialize(_FileStream, obj);
                }
            }        public object BinToObject(string FilePath)
            {
                IFormatter formatter = new BinaryFormatter();
                if (File.Exists(FilePath))
                {
                    using (FileStream _FileStream = new System.IO.FileStream(FilePath, 
                        System.IO.FileMode.Open, 
                        System.IO.FileAccess.Read, 
                        System.IO.FileShare.None
                        ))
                    {
                        _FileStream.Position = 0;
                        _FileStream.Seek(0, SeekOrigin.Begin);
                        return (object)formatter.Deserialize(_FileStream);
                    }
                }
                else 
                {
                    return null;
                }
            }        #endregion        #region SOAP序列化        public static void ObjectToSoap(object obj, string FilePath)
            {
                IFormatter formatter = new SoapFormatter();
                using (FileStream _FileStream = new System.IO.FileStream(FilePath, 
                    System.IO.FileMode.Create, 
                    System.IO.FileAccess.Write, 
                    System.IO.FileShare.None
                    ))
                {
                    formatter.Serialize(_FileStream, obj);
                }        }        public static object SoapToObject(string FilePath)
            {
                IFormatter formatter = new SoapFormatter();
                using (FileStream _FileStream = new System.IO.FileStream(FilePath, 
                    System.IO.FileMode.Open, 
                    System.IO.FileAccess.Read, 
                    System.IO.FileShare.None
                    ))
                {
                    return (object)formatter.Deserialize(_FileStream);
                }
            }        #endregion    }
    }
      

  6.   


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Web;
    using System.Web.Script.Serialization;
    using System.Xml.Serialization;
    using System.IO;
    using System.Runtime.Serialization;
    using System.Runtime.Serialization.Formatters.Binary;
    using System.Runtime.Serialization.Formatters.Soap;namespace Common
    {
        public class SerializableClass
        {        #region Json序列化
            
            public static void ObjectToJson(object obj, string FilePath)
            {
                JavaScriptSerializer _JavaScriptSerializer = new JavaScriptSerializer();
                string SerializableStr= _JavaScriptSerializer.Serialize(obj);
                File.WriteAllText(FilePath, SerializableStr);
            }        public static object JsonToObject(string FilePath)
            {
                StreamReader streamReader = new StreamReader(FilePath); 
                JavaScriptSerializer _JavaScriptSerializer = new JavaScriptSerializer();
                return _JavaScriptSerializer.DeserializeObject(streamReader.ReadToEnd());
            }        #endregion        #region Xml序列化        public static void ObjectToXml(object obj,string FilePath)
            {
                XmlSerializer _XmlSerializer = new XmlSerializer(obj.GetType());
                StreamWriter _StreamWriter = new StreamWriter(FilePath);
                _XmlSerializer.Serialize(_StreamWriter, obj);
            }        public static object XmlToObject(Type _Type, string FilePath)
            {
                XmlSerializer _XmlSerializer = new XmlSerializer(_Type);
                FileStream _FileStream = new FileStream(FilePath, FileMode.Open);
                return _XmlSerializer.Deserialize(_FileStream);
            }        #endregion        #region 二进制序列化        public void ObjectToBin(object obj, string FilePath)
            {
                IFormatter formatter = new BinaryFormatter();
                using (FileStream _FileStream = new System.IO.FileStream(FilePath, 
                    System.IO.FileMode.Create, 
                    System.IO.FileAccess.Write, 
                    System.IO.FileShare.None
                    ))
                {
                    _FileStream.Position = 0;
                    _FileStream.Seek(0, SeekOrigin.Begin);
                    formatter.Serialize(_FileStream, obj);
                }
            }        public object BinToObject(string FilePath)
            {
                IFormatter formatter = new BinaryFormatter();
                if (File.Exists(FilePath))
                {
                    using (FileStream _FileStream = new System.IO.FileStream(FilePath, 
                        System.IO.FileMode.Open, 
                        System.IO.FileAccess.Read, 
                        System.IO.FileShare.None
                        ))
                    {
                        _FileStream.Position = 0;
                        _FileStream.Seek(0, SeekOrigin.Begin);
                        return (object)formatter.Deserialize(_FileStream);
                    }
                }
                else 
                {
                    return null;
                }
            }        #endregion        #region SOAP序列化        public static void ObjectToSoap(object obj, string FilePath)
            {
                IFormatter formatter = new SoapFormatter();
                using (FileStream _FileStream = new System.IO.FileStream(FilePath, 
                    System.IO.FileMode.Create, 
                    System.IO.FileAccess.Write, 
                    System.IO.FileShare.None
                    ))
                {
                    formatter.Serialize(_FileStream, obj);
                }        }        public static object SoapToObject(string FilePath)
            {
                IFormatter formatter = new SoapFormatter();
                using (FileStream _FileStream = new System.IO.FileStream(FilePath, 
                    System.IO.FileMode.Open, 
                    System.IO.FileAccess.Read, 
                    System.IO.FileShare.None
                    ))
                {
                    return (object)formatter.Deserialize(_FileStream);
                }
            }        #endregion    }
    }
      

  7.   


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Web;
    using System.Web.Script.Serialization;
    using System.Xml.Serialization;
    using System.IO;
    using System.Runtime.Serialization;
    using System.Runtime.Serialization.Formatters.Binary;
    using System.Runtime.Serialization.Formatters.Soap;namespace Common
    {
        public class SerializableClass
        {        #region Json序列化
            
            public static void ObjectToJson(object obj, string FilePath)
            {
                JavaScriptSerializer _JavaScriptSerializer = new JavaScriptSerializer();
                string SerializableStr= _JavaScriptSerializer.Serialize(obj);
                File.WriteAllText(FilePath, SerializableStr);
            }        public static object JsonToObject(string FilePath)
            {
                StreamReader streamReader = new StreamReader(FilePath); 
                JavaScriptSerializer _JavaScriptSerializer = new JavaScriptSerializer();
                return _JavaScriptSerializer.DeserializeObject(streamReader.ReadToEnd());
            }        #endregion        #region Xml序列化        public static void ObjectToXml(object obj,string FilePath)
            {
                XmlSerializer _XmlSerializer = new XmlSerializer(obj.GetType());
                StreamWriter _StreamWriter = new StreamWriter(FilePath);
                _XmlSerializer.Serialize(_StreamWriter, obj);
            }        public static object XmlToObject(Type _Type, string FilePath)
            {
                XmlSerializer _XmlSerializer = new XmlSerializer(_Type);
                FileStream _FileStream = new FileStream(FilePath, FileMode.Open);
                return _XmlSerializer.Deserialize(_FileStream);
            }        #endregion        #region 二进制序列化        public void ObjectToBin(object obj, string FilePath)
            {
                IFormatter formatter = new BinaryFormatter();
                using (FileStream _FileStream = new System.IO.FileStream(FilePath, 
                    System.IO.FileMode.Create, 
                    System.IO.FileAccess.Write, 
                    System.IO.FileShare.None
                    ))
                {
                    _FileStream.Position = 0;
                    _FileStream.Seek(0, SeekOrigin.Begin);
                    formatter.Serialize(_FileStream, obj);
                }
            }        public object BinToObject(string FilePath)
            {
                IFormatter formatter = new BinaryFormatter();
                if (File.Exists(FilePath))
                {
                    using (FileStream _FileStream = new System.IO.FileStream(FilePath, 
                        System.IO.FileMode.Open, 
                        System.IO.FileAccess.Read, 
                        System.IO.FileShare.None
                        ))
                    {
                        _FileStream.Position = 0;
                        _FileStream.Seek(0, SeekOrigin.Begin);
                        return (object)formatter.Deserialize(_FileStream);
                    }
                }
                else 
                {
                    return null;
                }
            }        #endregion        #region SOAP序列化        public static void ObjectToSoap(object obj, string FilePath)
            {
                IFormatter formatter = new SoapFormatter();
                using (FileStream _FileStream = new System.IO.FileStream(FilePath, 
                    System.IO.FileMode.Create, 
                    System.IO.FileAccess.Write, 
                    System.IO.FileShare.None
                    ))
                {
                    formatter.Serialize(_FileStream, obj);
                }        }        public static object SoapToObject(string FilePath)
            {
                IFormatter formatter = new SoapFormatter();
                using (FileStream _FileStream = new System.IO.FileStream(FilePath, 
                    System.IO.FileMode.Open, 
                    System.IO.FileAccess.Read, 
                    System.IO.FileShare.None
                    ))
                {
                    return (object)formatter.Deserialize(_FileStream);
                }
            }        #endregion    }
    }
      

  8.   

    我做的是个拖放模型,一个panel,当运行程序时,用户可以拖放多个图标控件放入panel,并且将这些控件使用自定义的连线进行连接。希望将做好的连接模型进行保存,这样进行序列化的时候该怎样进行操作?
    (每一个图标控件和连线都是独立的一个类)
    还有其他的方法吗?
      

  9.   

    我做的是个拖放模型,一个panel,当运行程序时,用户可以拖放多个图标控件放入panel,并且将这些控件使用自定义的连线进行连接。希望将做好的连接模型进行保存,这样进行序列化的时候该怎样进行操作?
    (每一个图标控件和连线都是独立的一个类)
    还有其他的方法吗?
      

  10.   

    我做的是个拖放模型,一个panel,当运行程序时,用户可以拖放多个图标控件放入panel,并且将这些控件使用自定义的连线进行连接。希望将做好的连接模型进行保存,这样进行序列化的时候该怎样进行操作?
    (每一个图标控件和连线都是独立的一个类)
    还有其他的方法吗?
      

  11.   

    有啊,把状态卸载配置文件里或XML文件里。
      

  12.   

    我做的是个拖放模型,一个panel,当运行程序时,用户可以拖放多个图标控件放入panel,并且将这些控件使用自定义的连线进行连接。希望将做好的连接模型进行保存,这样进行序列化的时候该怎样进行操作? 
    (每一个图标控件和连线都是独立的一个类) 
    还有其他的方法吗?
      

  13.   

    动态加载的东西是不能够通过反射的方式访问的
    反射访问元数据有的东西,动态加的不在元数据里如果panel上的东西是用户后面自己添加的,保存后不能通过反射还原吧
    可以把panel上的控件保存到一个集合,序列化保存,窗体加载的时候反序列化,自己再加进去图标和线都是类的化,深序列化好了 ,图片也可以序列化反序列
      

  14.   

    定义一个Form类
    class MyForm : System.Windows.Forms.Form, IXmlSerializable
    然后在WriteXml方法里读枚举所有控件写到xml里,在ReadXml方法根据xml再生成控件层次。