Не удалось создать компонент. Тип не отмечен как Serializable
Я создаю пользовательский элемент управления WinForms, используя Visual С# 2008 Express Edition.
Все происходило красиво, пока я не нашел, что могу играть с свойством коллекции 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 С#.
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;
}
}
Ответы
Ответ 1
Несомненно, некоторые дополнительные атрибуты не могут быть сериализованы дизайнером, чтобы показать его на поверхности дизайнера.
Попробуйте добавить эти атрибуты к несериализуемым свойствам пользовательского элемента управления:
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public List<ColorData> PaletteColors { get; set; }
Ответ 2
Вы можете использовать это:
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public List<ColorData> PaletteColors { get; set; }
Но вы также можете добавить это, если ваша форма локализована:
[System.ComponentModel.Localizable(false)]
Ответ 3
Вы можете попробовать это, если хотите, чтобы его можно было просматривать в режиме разработки
[System.Xml.Serialization.XmlArray]
public List<Pen> PenList
{
get { return penList; }
set { penList = value; }
}
Ответ 4
Я не уверен в этом, но попытался ли вы использовать атрибут [Serializable]?
[Serializable]
public class ColorData
{
.....
}