繁体   English   中英

是否可以将控件(面板)存储为对象,对其进行序列化并将其存储为文件?

[英]Is it possible to store controls(Panel) as object, serialize it and store it as a file?

话题说明了一切。

使用Compact Framework C#

我正在将从URL下载的一些图像平铺(顺序/顺序很重要),并将其放入面板(每个图像是一个PictureBox)。 这可能是一个巨大的过程,可能需要一些时间。

因此,我只希望用户下载图像并将它们平铺一次。 因此,下一次用户使用图块应用程序时,第一次创建的面板已经存储在文件中,并从该文件中加载。

所以我想要的是一种将面板存储为文件的方法。

这是可能的,还是您认为我应该以其他方式进行?

我尝试过这样的事情:

            BinaryWriter panelStorage = new BinaryWriter(new FileStream("imagePanel.panel", FileMode.OpenOrCreate, FileAccess.Write, FileShare.None));
            Byte[] bImageObject = new Byte[20000];
            bImageObject = (byte[])(object)this.imagePanel;
            panelStorage .Write(bMapObject);
            panelStorage .Close();

但是强制转换不是很合法:P

“InvalidCastException的”

任何人都可以帮我解决这个问题吗?

先感谢您!

是的,您的代码将抛出,您无法将Control对象转换为byte []。 这种转换需要序列化,即BinaryFormatter执行的序列化。 问题是:Control类及其后代不能序列化,它们没有[Serializable]属性。

Control类是一个复杂的母亲,它具有数百个私有字段。 这些字段中有很多具有在运行时生成的值,通常是通过与本机Windows窗口进行互操作而生成的。 虽然序列化它们在某种程度上是可行的,但反序列化却不可能。 重建Control对象也需要重建本机窗口。 它本身具有很多状态,这种状态是通过向其发送一堆消息来设置的。 重新生成这些消息是不切实际的。

这不会给您带来很多吸引人的选择。 可以序列化UI,Windows窗体设计器和WPF XAML可以实现。 但这些都是非常大块的代码,不容易嵌入到你的程序。

降低目标,不要尝试序列化整个控件。 只是它的一些属性,例如“大小”和“位置”,您将有机会进行这项工作。

如果我是你,我不会序列化控件。 我宁愿序列化进入控件的数据。 有两个原因。

首先,它更容易。 您可以获取要放入的任何数据(图像),然后将其放入自定义MyPanel类中。 在那里也存储有关如何操作它们的信息,然后您可以序列化该类,此操作就完成了。

第二个原因是,如果您想更改以后显示或使用数据的方式,则拥有更大的自由度。 您可以以其他方式使用它,或与其他应用程序和控件一起使用,而无需您付出任何实际的努力。

ResX文件序列化控件的几个属性。 也许您可以使用那些?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM