如何序列化和反序列化tabcontrol c#

时间:2015-10-30 16:35:59

标签: c# winforms serialization tabcontrol

我正在使用tabcontrol,我想序列化并保存。我使用此代码,但它给tabcontrol类没有标记为可序列化。如何将其标记为可序列化,因为我无法覆盖该类。怎么做?

using (Stream stream = File.Open("data.dat", FileMode.Create))
{
    BinaryFormatter bin = new BinaryFormatter();
    bin.Serialize(stream,tabControl1);
}

它给出了这个错误

  

System.Windows.Forms.TabControl未标记为可序列化

1 个答案:

答案 0 :(得分:3)

为什么不对序列号进行控制,还有其他选择吗?

如果序列化控件,则存在一些问题:

  1. 你不能这样做,因为System.Windows.Forms.TabControl没有像你看到的那样被标记为可序列化。
  2. 如果你这样做并且只有在允许的情况下,是否有很多属性和类,接口,事件等用它序列化,继承自上面的类,这不是你想要的

    enter image description here

  3. 你可以做到的唯一方法是创建一个新类,绑定你将使用属性保存的所有值并序列化该类。

    [Serializable] // don't forget this! It will mark your class so you can serialize it.
    public class BindingClass // p.s.: give this a better name!
    {
        public string Text { get; set; } // Bind whit a control of your tab control.
        public float Number { get; set; }
        public string ImageLocation { get; set; } // used for the image
        public IEnumerable<object> ListOfString { get; set; } // used for a list
    }
    

    代码示例

    文字和数字

    对于文字和数字来说很容易。你可以强化你的课程,你可以绑定它。之后你可以序列化它。一个例子:

    BindingClass bc = new BindingClass();
    bc.Text = textBox1.Text;
    bc.Number = numbericUpDown.Value;
    
    using (Stream stream = File.Open("data.dat", FileMode.Create))
    {
        BinaryFormatter bin = new BinaryFormatter();
        bin.Serialize(stream, bc);
    }
    

    图片

    对于图像来说有点复杂。您可以序列化图像,但这样做也是一件坏事。更好的方法是将图像保存在项目的bin/debug文件夹中,并序列化该图像的路径。一个例子:

    string imageLocation = Application.StartupPath + @"\myImage.jpg"
    pictureBox1.Image.Save(imageLocation, ImageFormat.Jpeg);
    
    // declare bc like code above.
    bc.ImageLocation = imageLocation;
    
    // serialize bc.
    

    如果图像中已存在图像,则可以覆盖它。但是,如果您将使用历史记录,而不是一件好事......您可以使用当前日期时间作为文件名来解决它!用这个改变你的代码:

    string imageLocation = Application.StartupPath +
                           DateTime.Now.ToString("yyyyMMddHHmmss") + ".jpg"
    

    注意:您还可以使用blobAzure (非免费)Amazon服务或上传图片ImgurFlickr或9gag (免费)。注意客户端和服务器之间必须存在Internet连接。您可以通过搜索Google如何进行上传。

    字符串列表

    对于字符串列表,您可以使用:

    bc.ListOfString = comboBox1.Items;
    

    注意

    我还没有测试代码。因此,如果您遇到问题,示例会对其进行评论,我会查看它,但请尝试在Google上查找问题的解决方案。亲自尝试,最好的学习方法......

    序列化的替代方案(更新16-Jun-16)

    序列化是一种保存方式,使您的代码对人们来说不可读。但是,如果扩展应用程序,则会出现问题。问题也是由Microsoft Word发生的。旧的.doc文件也是序列化代码,新的.docx文件是压缩的xml文件,现在可以更轻松地生成.docx个文件。

    好的替代方案是JsonXML