我拥有byte[]
属性的用户控件。阵列在设计时也会变得庞大。当Visual Studio保存表单时,它使用此方法将其保存到cs文件
this.ctlShowSpreadsheet1.SerializationContent = new byte[] {
((byte)(80)),
((byte)(75)),
((byte)(3)),
((byte)(4)),
((byte)(20)),
((byte)(0)),
((byte)(2)),
((byte)(0)),
((byte)(8)),
((byte)(0)),
((byte)(128)),
((byte)(84)),
((byte)(29)),
...
有没有办法强制将字节数组保存到resx文件中?
我尝试更改DesignerSerializationVisibility
,但没有结果。
答案 0 :(得分:1)
如果属性的类型为Serializable
,则设计器会将其序列化为资源文件。
因此,在您的情况下,您可以创建一个可序列化的字节列表并使用它存储您的字节列表。请记住,设计人员需要将可序列化的类放在不同的程序集中。
在下面的例子中,我创建了一个具有字节列表属性的控件,该属性将存储在表单的resx文件中。为此,请按照下列步骤操作:
MyControl
的实例。 ByteList
属性并展开它。Bytes
属性。查看属性值是否保存在表单的资源文件中。设计人员还会生成代码以从资源中获取值:
this.myControl1.ByteList = ((WindowsFormsControlLibrary1.SerializableByteList)
(resources.GetObject("myControl1.ByteList")));
代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;
public class MyControl: UserControl
{
public MyControl()
{
ByteList = new SerializableByteList();
}
[TypeConverter(typeof(ExpandableObjectConverter))]
public SerializableByteList ByteList { get; set; }
}
[Serializable]
public class SerializableByteList
{
public SerializableByteList()
{
Bytes = new List<byte>();
}
public List<byte> Bytes { get; set; }
}
注意强>
有关设计器序列化的更多信息,请查看Customizing Code Generation in the .NET Framework Visual Designers。
使用二进制序列化
并非所有类型都能干净利落地进行代码生成。例如,如何将位图序列化为代码?你可以编码 它作为一个字符串,但即使是一个中等大小的位图字符串 可能比文件中的其余代码大得多。该 Designer通过将二进制类型持久化来解决此问题 资源文件,将值推送到.NET的清单中 框架应用。然后,当应用程序初始化时,它 可以将值加载回Assembly的清单中。
在尝试序列化类型时,代码生成器遵循此顺序:
- 内置基本类型的序列化(字符串,bool,整数,浮点数等)
- 自定义类型的InstanceDescriptor序列化
- 标记为Serializable的类型的二进制序列化。
请记住,您可以控制设计器序列化的方式
通过为您的类实现ISerializable
接口来实现对象。