我正在使用tabcontrol,我想序列化并保存。我使用此代码,但它给tabcontrol类没有标记为可序列化。如何将其标记为可序列化,因为我无法覆盖该类。怎么做?
using (Stream stream = File.Open("data.dat", FileMode.Create))
{
BinaryFormatter bin = new BinaryFormatter();
bin.Serialize(stream,tabControl1);
}
它给出了这个错误
System.Windows.Forms.TabControl未标记为可序列化
答案 0 :(得分:3)
如果序列化控件,则存在一些问题:
System.Windows.Forms.TabControl
没有像你看到的那样被标记为可序列化。如果你这样做并且只有在允许的情况下,是否有很多属性和类,接口,事件等用它序列化,继承自上面的类,这不是你想要的
你可以做到的唯一方法是创建一个新类,绑定你将使用属性保存的所有值并序列化该类。
[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"
注意:您还可以使用blob和Azure (非免费)等Amazon服务或上传图片Imgur,Flickr或9gag (免费)。注意客户端和服务器之间必须存在Internet连接。您可以通过搜索Google如何进行上传。
对于字符串列表,您可以使用:
bc.ListOfString = comboBox1.Items;
我还没有测试代码。因此,如果您遇到问题,示例会对其进行评论,我会查看它,但请尝试在Google上查找问题的解决方案。亲自尝试,最好的学习方法......
序列化是一种保存方式,使您的代码对人们来说不可读。但是,如果扩展应用程序,则会出现问题。问题也是由Microsoft Word发生的。旧的.doc
文件也是序列化代码,新的.docx
文件是压缩的xml文件,现在可以更轻松地生成.docx
个文件。