Ошибка загрузки значения свойства в DesignMode
От: Inquisitive Украина  
Дата: 19.04.07 10:07
Оценка:
При попытке открыть форму (System.Windows.Forms) в режиме дизайнера появляется сообщение об ошибке:
Unable to load type System.Collections.Generic.List`1[[JupiterControlLibrary.ReferenceParameter, JupiterControlLibrary, Version=1.0.2665.20165, Culture=neutral, PublicKeyToken=null]] required for deserialization.
На форме использован мой компонент (JupiterControlLibrary.DataReference) у которого есть свойство
[Category("Data Reference")]
[ReadOnly(false)]
[Browsable(true)]
public List<JupiterControlLibrary.ReferenceParameter>{get;set;}


Когда значение свойства не задано — ошибка не возникает.
Фрагмент кода в котором возникает ошибка:
private void InitializeComponent ()
{
........
this.dataReference1.ParentParameters =
((System.Collections.Generic.List<JupiterControlLibrary.ReferenceParameter>)(resources.GetObject("dataReference1.ParentParameters")));
........
}
Сборка компилируется, запускается, работает нормально.
Ошибка возникает при повторном открытии формы в режиме дизайнера.

В чем тут проблема?
Re: Ошибка загрузки значения свойства в DesignMode
От: muse Россия  
Дата: 19.04.07 11:01
Оценка:
Здравствуйте, Inquisitive, Вы писали:

I>В чем тут проблема?


Сделай ReferenceParameter сериализуемым.
Примерно так:


[Serializable]
public class GridColumnInfo : ISerializable
{
    private string Column_Name;
    private string DataColumn_Name;
    private string Column_HeaderText;
    private bool Column_Visible;
    private bool frosen;
    private int Column_Width;
    private int Column_DisplayIndex;

    #region .ctor

    public GridColumnInfo()
    {
        Column_Name = "";
        Column_HeaderText = "";
        Column_Visible = true;
        frosen = false;
        Column_Width = -1;
        Column_DisplayIndex = -1;
    }

    private GridColumnInfo(SerializationInfo info, StreamingContext context)
    {
        if (info == null)
        {
            throw new ArgumentNullException("info");
        }
        this.Column_Name = (string)info.GetValue("Column_Name", typeof(string));
        this.Column_HeaderText = (string)info.GetValue("Column_HeaderText", typeof(string));
        this.Column_Visible = (bool)info.GetValue("Column_Visible", typeof(bool));
        this.frosen = (bool)info.GetValue("frosen", typeof(bool));
        this.Column_Width = (int)info.GetValue("Column_Width", typeof(int));
        this.Column_DisplayIndex = (int)info.GetValue("Column_DisplayIndex", typeof(int));
    }

    #endregion

    [
    SecurityPermissionAttribute(
        SecurityAction.LinkDemand, 
        Flags = SecurityPermissionFlag.SerializationFormatter)
    ]
    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        if (info == null)
        {
            throw new ArgumentNullException("info");
        }
        info.AddValue("Column_DisplayIndex", this.Column_DisplayIndex);
        info.AddValue("Column_HeaderText", this.Column_HeaderText);
        info.AddValue("Column_Name", this.Column_Name);
        info.AddValue("Column_Visible", this.Column_Visible);
        info.AddValue("Column_Width", this.Column_Width);
        info.AddValue("frosen", this.frosen);
    }

    public string DataColumnName
    {
        get { return this.DataColumn_Name; }
        set { this.DataColumn_Name = value; }
    }
    public string Name
    {
        get { return this.Column_Name; }
        set { this.Column_Name = value; }
    }
    public bool Visible
    {
        get { return this.Column_Visible; }
        set { this.Column_Visible = value; }
    }
    public int Width
    {
        get { return this.Column_Width; }
        set { this.Column_Width = value; }
    }
    public int DisplayIndex
    {
        get { return this.Column_DisplayIndex; }
        set { this.Column_DisplayIndex = value; }
    }
    public string HeaderText
    {
        get { return this.Column_HeaderText; }
        set { this.Column_HeaderText = value; }
    }
    public bool IsFrosen
    {
        get { return this.frosen; }
        set { this.frosen = value; }
    }
}



Код использования

[NonSerialized]
private List<GridColumnInfo> сolumnsSettings;

[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
[DefaultValue(null)]
public List<GridColumnInfo> GridColumns
{
    get
    {
        if (this.сolumnsSettings == null)
            this.сolumnsSettings = new List<GridColumnInfo>();
        return this.сolumnsSettings;
    }
    set
    {
        this.сolumnsSettings = value;
        OnConfigurationChanged();
    }
}
Люблю повеселиться, особенно пожрать
Re[2]: Ошибка загрузки значения свойства в DesignMode
От: Inquisitive Украина  
Дата: 19.04.07 23:05
Оценка:
Здравствуйте, muse, Вы писали:

M>Здравствуйте, Inquisitive, Вы писали:


I>>В чем тут проблема?


M>Сделай ReferenceParameter сериализуемым.

M>Примерно так:

Спасибо, помогло.
Не думал, что надо наследовать интерфейс ISerializable.
Думал, что наличие атрибута Serializable обеспечит сериализацию (по крайней мере public свойств).
Непонятно, почему проблема была только в момент разработки. Ведь приложение раболтало.
Re[2]: Ошибка загрузки значения свойства в DesignMode
От: Inquisitive Украина  
Дата: 20.04.07 07:35
Оценка:
Здравствуйте, muse, Вы писали:

M>Здравствуйте, Inquisitive, Вы писали:


I>>В чем тут проблема?


M>Сделай ReferenceParameter сериализуемым.

M>Примерно так:

Потом все возвращается.
Например, после закрітия и повторного запуска VS
Re[2]: Ошибка загрузки значения свойства в DesignMode
От: Inquisitive Украина  
Дата: 20.04.07 10:04
Оценка:
Все почти нормально, я просто не полностью использовал Ваш пример, не указал атрибут [NonSerialized] в декларации private — поля.
После указания атрибута, проблема, в общем, разрешилась,
но...: если закрыть солюшин с активным дизайнером той формы — на которой находится компонент,
а потом открыть то, ВС2005 при попытке показать дизайнер снова выдает эту ошибку.
Если закрыть дизайнер с ошибкой и открыть снова — все нормально.

Большое спасибо за помощь!

Но всеравно непонятно, почему в рантайме все работало (ресурс считывался, де-сериализовался, ....),
а для нормальной работы дизайнера потребовалось наследовать ISerializable?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.