Jon*_*ood 14 c# serialization user-controls winforms
我正在使用Visual C#2008 Express Edition创建WinForms用户控件.
一切都很顺利,直到我发现我可以List<>从属性窗口玩一个集合属性.在尝试更改集合并运行项目之后,我开始遇到错误并尽力将所有内容恢复到工作时的状态.
现在,当我尝试将控件的实例放在表单上时,我收到以下错误.
Failed to create component 'ColorPicker'. The error message follows:
'System.Runtime.Serialization.SerializationException: Type 'WindowsFormsApplication1.ColorPicker+ColorData' in Assembly 'Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.
at System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType type)
at System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type type, StreamingContext context)
at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo()
at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Type objectType, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter)
at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize(Type objectType, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter)
at System.Runtime.Serialization.Formatt...'
Run Code Online (Sandbox Code Playgroud)
在解除此错误后,我开始反复出现以下错误,直到我使用任务管理器关闭Visual C#.
Code generation for property 'PaletteColors' failed. Error was: 'Type 'WindowsFormsApplication1.ColorPicker+ColorData' in Assembly 'Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.'
Run Code Online (Sandbox Code Playgroud)
我尝试标记我的ColorData类,[Serializable]但后来开始得到其他错误.我不记得确切的细节,但它并不重要,因为我不希望这个数据序列化.
我尝试了一个新的表单并得到了同样的错误.所以我创建了一个全新的项目,并将我的类代码复制到新的用户控件,但仍然会出现错误.任何人都可以建议可能导致此错误的原因吗?我不希望这个集合序列化.
这是有问题的集合(这些是我的用户控件中的行 - ColorData类嵌套在我的用户控件中).
public List<ColorData> PaletteColors { get; set; }
public class ColorData
{
public string Text { get; set; }
public Color Color { get; set; }
public ColorData()
{
Text = String.Empty;
Color = Color.White;
}
public ColorData(string text, Color color)
{
Text = text;
Color = color;
}
public ColorData(KnownColor color)
{
Text = Enum.GetName(typeof(KnownColor), color);
Color = Color.FromKnownColor(color);
}
public override string ToString()
{
return Text;
}
}
Run Code Online (Sandbox Code Playgroud)
小智 21
毫无疑问,设计师无法将一些额外的属性序列化,以便在设计师的表面上展示它.
尝试将这些属性添加到用户控件的非可序列化属性中:
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public List<ColorData> PaletteColors { get; set; }
Run Code Online (Sandbox Code Playgroud)