Проверка десериализации - PullRequest
2 голосов
/ 08 февраля 2009

Я работаю со списком шрифтов, которые я сериализую и десериализую, используя DataContractSerializer. Между двумя шагами возможно, что пользователь удалил шрифт со своего компьютера. Я хотел бы проверить имя шрифта, поскольку он десериализован, чтобы убедиться, что он все еще существует в системе. Если он не существует, этот элемент не включается в коллекцию, возвращаемую DataContractSerializer.ReadObject().

В частности, я храню FontFamily и сериализую свойство, которое получает FontFamily.Name. В наборе доступа этого свойства я преобразовываю строку обратно в FontFamily.

Единственная разумная альтернатива валидации, о которой я могу подумать, - это чтобы метод доступа set свойства игнорировал недопустимые значения и позже отфильтровывал недействительные десериализованные объекты. Однако мне не нравится этот вариант - есть ли более правильный путь?

Ответы [ 2 ]

3 голосов
/ 08 февраля 2009

Почему бы не воспользоваться преимуществами OnDeserializedAttribute? Попросите ваш обратный вызов выполнить проверку и удаление элементов, которые недопустимы для клиентской среды.

http://msdn.microsoft.com/en-us/library/ms733734.aspx

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

(Например: я помню, как особенно разочаровывался старыми версиями MS Publisher, когда работал над документом на двух разных машинах, подключенных к двум разным принтерам. Когда бы я ни изменял файл на одной машине, Publisher переформатировал документ, предназначенный для принтера, подключенного к этой машине. Когда я вернулся на другую машину, на которой собирался выполнять фактическую печать, Publisher снова переформатировал, но поля были не совсем правильными, и мне пришлось немного подправить. )

0 голосов
/ 08 февраля 2009

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

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