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

时间:2010-03-31 07:26:54

标签: c# serialization compact-framework makefile

主题说明了一切。

使用Compact Framework C#

我正在平铺(顺序/序列很重要)我从网址下载到Panel中的一些图像(每个图像都是PictureBox)。 这可能是一个巨大的过程,可能需要一些时间。

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

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

这可能,或者你认为我应该采取另一种方式吗?

我尝试过这样的事情:

            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的”

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

提前谢谢!

3 个答案:

答案 0 :(得分:1)

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

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

这并没有给你留下很多有吸引力的选择。可以序列化UI,Windows窗体设计器和WPF XAML可以实现。但这些非常大块代码,不容易嵌入到您的程序中。

目标较低,不要尝试序列化整个控件。只是它的一些属性,如大小和位置,你将有机会使这项工作。

答案 1 :(得分:1)

如果我是你,我不会将控件序列化。相反,我会将进入控件的数据序列化。有几个原因。

首先,它更容易。您可以获取您放入的任何数据(图像)并将它们放入自定义MyPanel类或其他任何内容中。存储有关如何操作它们的信息,然后您可以序列化该类,并且已完成。

第二个原因是,如果您想要更改数据在以​​后显示或使用的方式,您可以获得更多自由。您可以通过其他方式使用它,或者与其他应用程序和控件一起使用,而无需您做任何实际操作。

答案 2 :(得分:0)

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

相关问题