Зачем мне вообще сериализовывать? - PullRequest
3 голосов
/ 05 мая 2010

Итак, я работаю со следующей сборкой, которая имеет следующее определение (довольно безвредное):

public class QueryDefinition
{
    private List<QueryFilter> TheCurrentFilters = null;

    public List<QueryFilter> CurrentFilters
    {
        set { TheCurrentFilters = value; }
        get { return TheCurrentFilters; }
    }

    // other code

    public class QueryFilter
    {
        // member variables are: seven public string's & two public int's

        public override string ToString()
        {
            return FilterText;
        }
    }
}

В другой сборке у нас есть UserControl:

public partial class QueryWizard : UserControl
{
    private List<QueryDefinition.QueryFilter> TheCurrentFilters = null;

    public List<QueryDefinition.QueryFilter> CurrentFilters
    {
        set { TheCurrentFilters = value; }
        get { return TheCurrentFilters; }
    }

    // other code
}

Интересный код, но это то, с чем я должен работать.

Во всяком случае, если я иду в другой проект (который ссылается на этот UserControl), создаю форму, а затем перетаскиваю элемент управления на форму, я получаю эту ошибку:

'System.Runtime.Serialization.SerializationException: тип QueryDefinition + QueryFilter' в сборке ... не помечен как сериализуемый. '

На самом деле я не использую какой-либо код сериализации, так что из этого списка QueryFilter является причиной SerializationException?

Я использовал тег [Serializable], чтобы избавиться от этого. Но недавно мы перестраивали проекты (обновление Visual WebGUI), и теперь я столкнулся с проблемой «невозможно загрузить тип, необходимый для десериализации». Вместо того чтобы разобраться в этой проблеме, я решил попытаться выяснить, зачем нам нужны теги сериализации! Спасибо.

Ответы [ 2 ]

2 голосов
/ 05 мая 2010

Фактические значения для CurrentFilters сериализуются с использованием BinaryFormatter и сохраняются в файле .resx. Вы почти наверняка не хотите, чтобы это произошло. Например, вы возьмете зависимость от номера [AssemblyVersion] сборки, содержащей ваш класс QueryFilter. Который должен объяснить исключение «невозможно загрузить тип», которое вы получаете сейчас.

Сначала выясните, как у CurrentFilters были значения во время разработки. Вам нужно остерегаться событий, которые происходят во время разработки. Типичными кандидатами являются конструктор и событие Load. Используйте свойство Control.DesignTime, чтобы запретить выполнение кода.

Далее, убедитесь, что значение свойства не сохраняется, применяя атрибут:

 [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 public List<QueryFilter> CurrentFilters
 {
 }
2 голосов
/ 05 мая 2010

Это связано с тем, что разработчик пытается сериализовать содержимое элемента управления "CurrentFilters" в код инициализации формы.

Проверьте атрибут DesignerSerializationVisibility: http://msdn.microsoft.com/en-us/library/system.componentmodel.designerserializationvisibility.aspx

Если вы не намерены поддерживать редактирование свойства CurrentFilters во время разработки, его установка на скрытое должна решить проблему (я думаю, прошло много времени, так как я создавал элементы управления winforms)

...