2010-03-19 2 views
3

Я использовал сериализацию по умолчанию .NET для класса с членом System.Drawing.Color. Код теперь используется людьми, и мне нужно добавить дополнительный элемент в класс, но все же десериализовать старые версии.Сериализация System.Drawing.Color в .NET

Итак, я попробовал стандартный способ сделать это: интерфейс ISerializable, используя методы SerializationInfo для получения элементов int и string.

Проблема: у моего класса также есть член System.Drawing.Color, но SerializationInfo не предоставляет метод GetColor для чтения этого типа данных. Я попытался получить его как int и как строку, и отбросил его в System.Drawing.Color, но не повезло.

Кто-нибудь знает, как десериализовать System.Drawing.Color из SerializationInfo?

ответ

1

Использование ISerializable не рекомендуется для решения вопросов, связанных с версиями. [OptionalField], входы и выходы хорошо описаны в этом MSDN library article.

Отвечая на ваш вопрос: SerializationInfo.GetValue ("fieldName", typeof (Цвет)) должен дать вам цвет. Вам нужно будет вернуть возвращаемое значение.

+0

Спасибо за ответы. К сожалению [OptionalField] работает только с BinaryFormatter (я использую SoapFormatter). Ваше предложение GetValue скомпилировано, но теперь я получаю исключение: «Top Object не может быть создан для элемента« foreColor »» (foreColor - это элемент, который я пытаюсь десериализовать.) Любая идея, что вызывает эту ошибку, или чередует подходы? Благодаря! – user20493

1

Я использовал что-то подобное в прошлом.

<Xml.Serialization.XmlIgnore()> Public BackColour As Drawing.Color 

     Public Property xmlBackColour() As Integer 
      Get 
       Return BackColour.ToArgb 
      End Get 
      Set(ByVal value As Integer) 
       BackColour = Drawing.Color.FromArgb(value) 
      End Set 
     End Property 
Смежные вопросы