Не удалось создать компонент. Тип не помечен как сериализуемый - PullRequest
14 голосов
/ 11 февраля 2011

Я создаю пользовательский элемент управления WinForms с использованием Visual C # 2008 Express Edition.

Все шло хорошо, пока я не обнаружил, что могу играть со свойством List<> collection из окна свойств. После попытки изменить коллекцию и запустить проект, я начал получать ошибки и делал все возможное, чтобы вернуть все туда, где оно было, когда оно работало.

Теперь, когда я пытаюсь поместить экземпляр элемента управления в форму, я получаю следующую ошибку.

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;
    }
}

Ответы [ 4 ]

21 голосов
/ 11 февраля 2011

Нет сомнений, что некоторые дополнительные атрибуты не сериализуются дизайнером, чтобы показать его на поверхности конструктора.

Попробуйте добавить эти атрибуты в несериализуемые свойства пользовательского элемента управления:

[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public List<ColorData> PaletteColors { get; set; } 
3 голосов
/ 07 апреля 2011

Вы можете использовать это:

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

Но вы также можете добавить это, если ваша форма локализована:

 [System.ComponentModel.Localizable(false)]
2 голосов
/ 06 ноября 2012

Вы можете попробовать это, если хотите быть доступным для просмотра в режиме конструктора

[System.Xml.Serialization.XmlArray]
    public List<Pen> PenList
    {
        get { return penList; }
        set { penList = value; }
    }
1 голос
/ 11 февраля 2011

Я не уверен в этом, но вы пытались использовать атрибут [Serializable]?

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