无法创建组件..类型不标记为可序列化

问题描述:

我使用Visual C#2008速成版创建了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...' 

解除此错误后,我开始出现以下错误,通常会重复出现,直到我使用任务管理器关闭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.' 

我试图将我的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; 
    } 
} 

毫无疑问,它是一些额外的属性不能由设计器序列化,以显示在设计器的表面。

尝试将这些属性添加到用户控件的非序列特性:

[Browsable(false)] 
[EditorBrowsable(EditorBrowsableState.Never)] 
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 
public List<ColorData> PaletteColors { get; set; } 

我对此没有把握,但是您是否尝试过使用[Serializable]属性?

[Serializable] 
public class ColorData 
{ 
..... 
} 
+1

我在我的问题中解释过我做过。 – 2011-02-11 23:00:00

+1

这与OP正在寻找的是相反的。它不可序列化并不意外,Visual Studio认为它应该是可序列化的! – Arunas 2014-11-26 20:43:23

您可以使用此:

[Browsable(false)] 
[EditorBrowsable(EditorBrowsableState.Never)] 
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 
public List<ColorData> PaletteColors { get; set; } 

但你也可以添加这个,如果你的表格是局部的:

[System.ComponentModel.Localizable(false)] 

如果您想在设计模式中浏览,您可以尝试此操作

[System.Xml.Serialization.XmlArray] 
    public List<Pen> PenList 
    { 
     get { return penList; } 
     set { penList = value; } 
    }