2010-05-05 3 views
3

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

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 'в Assembly ... не помечен как сериализуемый.'

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

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

+0

взглянуть на трассировку стека исключений – Andrey

ответ

2

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

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

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

+0

Своевременный и правильный ответ! Я очень благодарен. Зеленая отметка для вас! – JustLooking

2

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

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

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

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 
public List<QueryFilter> CurrentFilters 
{ 
} 
+0

Спот-он. Большое спасибо за ваше время. Я поддержал ответ, но я думаю, что зеленая галочка идет к Роджеру. Хотелось бы, чтобы я мог передать его вам обоим, но похоже, что Роджеру это нужно немного больше. У вас достаточно очков на всю жизнь! – JustLooking

Смежные вопросы