Проектирование времени сериализации в C # - PullRequest
6 голосов
/ 01 октября 2008

Я создал невизуальный компонент в C #, который разработан как заполнитель метаданных в форме.
Компонент имеет свойство, представляющее собой коллекцию пользовательских объектов, этот объект помечен как Serializable и реализует GetObjectData для сериализации и открытый конструктор для десериализации.

В файле resx для формы он сгенерирует двоичные данные для хранения коллекции, однако каждый раз, когда я изменяю сериализованный класс, я получаю ошибки конструктора и мне нужно вручную удалить данные из файла resx, а затем воссоздать заново эти данные.

Я пытался изменить конструктор так, чтобы вокруг каждого свойства в классе был блок try / catch

try
{
  _Name = info.GetString("Name");
}
catch (SerializationException)
{
  this._Name = string.Empty;
}

но все равно падает. Последняя ошибка, которую я получил, заключалась в том, что мне пришлось реализовать IConvertible.

Я бы предпочел использовать сериализацию xml, потому что я по крайней мере вижу это, возможно ли это для использования дизайнером?

Есть ли способ сделать сериализацию более стабильной и менее устойчивой к изменениям?

Edit:
Больше информации ... может быть лучше описание
У меня есть класс, который наследует от Компонента, у него есть одно свойство, которое представляет собой набор правил. Кажется, что коллекция правил должна быть помечена как сериализуемая, иначе она не сохраняет своих членов.

Класс Rules также является компонентом с атрибутом DesignTimeVisible (false), чтобы он не отображался на панели компонентов. Этот класс не помечен как Serializable.

Если коллекция, помеченная как Serializable, генерирует двоичные данные в файле resx (не идеально), и среда IDE сообщает, что класс Rules не является Serializable.

Я думаю, что эта проблема выходит за рамки простого вопроса. Так что я, вероятно, закрою его в ближайшее время.
Если у кого-то есть ссылки на что-то подобное, это очень поможет.

Ответы [ 3 ]

2 голосов
/ 02 октября 2008

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

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

[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]

на имущество и обработать инициализацию самостоятельно.

2 голосов
/ 14 октября 2008

Я с тех пор обнаружил, где я иду не так.

Компонент, в котором я реализовывал пользовательскую коллекцию (унаследованную от CollectionBase), изменил ее на List и добавил атрибут DesignerSerializationVisibility (DesignerSerializationVisibility.Content) в свойство List, этот список также доступен только для чтения. Затем будет создан код для генерации всех свойств компонентов и всех записей в списке.

Классу, хранящемуся в списке, не нужны особые атрибуты или он должен быть сериализуемым.

private List<Rule> _Rules;
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public List<Rule> Rules
{
    get { return _Rules; }
}
2 голосов
/ 01 октября 2008

Возможно, вы захотите попробовать альтернативный подход - заставить все сериализоваться как сгенерированный код. Сделать это очень легко. Просто реализуйте свой невизуальный класс из Component . Затем представьте свою коллекцию как есть, но убедитесь, что каждый объект, помещенный в коллекцию, сам по себе получен из Component . Делая это, все генерируется кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...