Десериализация и DefaultValueAttribute
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Десериализация и DefaultValueAttribute Expand / Collapse
Автор
Сообщение
11.04.2006 16:33


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 13.12.2007 18:51
Сообщ.: 3 047, Visits: 33 391
Допустим, имею класс с двумя свойствами:

_
Public Property IntProp() As Integer
Get
IntProp = c_IntProp
End Get
Set(ByVal value As Integer)
c_IntProp = value
End Set
End Property

_
Public Property StrProp() As String
Get
StrProp = c_StrProp
End Get
Set(ByVal value As String)
c_StrProp = value
End Set
End Property


Как видите, у каждого из свойств установлено дефолтное значение. Поэтому, когда я сериализую (через XmlSerializer и FileStream) экземпляр этого класса, то в итоговый XML-файл попадают только те свойства, значения которых [bold]отличаются[/bold] от дефолтных. Например, если IntProp = 123 (не равно 5), а StrProp = "Вася" (совпадает с дефолтом), то XML будет выглядеть так:



123


т.е. StrProp в него не попадает. Что ж, так и задумано.

Однако, когда я выполняю [underline]десериализацию[/underline] из этого XML-файла, то StrProp получит пустое значение, - если только в конструкторе класса нет явной инициализации свойства StrProp в строку "Вася". Получается, что дефолтные значения нужно указывать в ДВУХ местах: в атрибутах [bold]DefaultValueAttribute[/bold] и в коде конструктора. С одной стороны, это логично: атрибуты - это [bold]метаданные[/bold], а конструктор - это [bold]код[/bold]. Но с другой стороны, очень хоцца сказать конструктору: [italic]"А ну-ка возьми-ка начальные значения всех членов класса из метаданных! чтоб мне любимому дважды не писАть!"...[/italic] вопрос в том, КАК это сделать? как заставить конструктор проинициализировать экземплярные члены класса значениями из соотв. атрибутов [bold]DefaultValueAttribute[/bold]?!



While (!Life.EOF) { You.Money ++; You.Girls.Add(new Girl(90,60,90)); BeHappy(); }
Сообщ. #895013
11.04.2006 17:14


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 13.12.2007 18:51
Сообщ.: 3 047, Visits: 33 391
Хм... похоже, не я один этим вопросом задавался:
на странице http://support.microsoft.com/kb/311339/en-us сказано:

[bold]MSDN documentation for the DefaultValueAttribute class may be confusing.[/bold]
...
...
However, the DefaultValue attribute does not cause the initial value to be initialized with the attribute's value.


Иными словами, нужно явно задавать дефолты в ДВУХ местах - и в атрибуте, и в конструкторе. Вот так. Причём в конструкторе можно читать прямо из метаданных:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconretrievinginformationstoredinattributes.asp
(статья "[bold]Retrieving Information Stored in Attributes[/bold]").

Сам спросил - сам ответил ;)



While (!Life.EOF) { You.Money ++; You.Girls.Add(new Girl(90,60,90)); BeHappy(); }
Сообщ. #895016
« пред. тема | след. тема »


Эту тему читают Expand / Collapse
Посетители: 0 (0 гостей, 0 участников, 0 скрыт.участников)
Сейчас нет участников, просматривающих тему.
Модераторы: Alexey, boombastik, bazile, pl, Alexey Spirin

Время GMT +3:00, Сейчас 9:59