2011-02-11 139 views
14

我使用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; 
    } 
} 

回答

21

毫無疑問,它是一些額外的屬性不能由設計器序列化,以顯示在設計器的表面。

嘗試將這些屬性添加到用戶控件的非序列特性:

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

我對此沒有把握,但是您是否嘗試過使用[Serializable]屬性?

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

我在我的問題中解釋過我做過。 – 2011-02-11 23:00:00

+1

這與OP正在尋找的是相反的。它不可序列化並不意外,Visual Studio認爲它應該是可序列化的! – Arunas 2014-11-26 20:43:23

3

您可以使用此:

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

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

[System.ComponentModel.Localizable(false)] 
2

如果您想在設計模式中瀏覽,您可以嘗試此操作

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