﻿<?xml version='1.0' encoding='UTF-8'?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Релиб / Программирование / .NET  / Десериализация и DefaultValueAttribute / Latest Posts</title><generator>InstantForum.NET v4.1.4</generator><description>Релиб</description><link>http://www.relib.com/forums/</link><webMaster>robot@relib.com</webMaster><lastBuildDate>Wed, 15 Oct 2008 00:50:40 GMT</lastBuildDate><ttl>20</ttl><item><title>RE: Десериализация и DefaultValueAttribute</title><link>http://www.relib.com/forums/Topic895013-16-1.aspx</link><description>Хм... похоже, не я один этим вопросом задавался:на странице [url]http://support.microsoft.com/kb/311339/en-us[/url] сказано:[quote][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.[/quote]Иными словами, нужно явно задавать дефолты в ДВУХ местах - и в атрибуте, и в конструкторе. Вот так. Причём в конструкторе можно читать прямо из метаданных:[url]http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconretrievinginformationstoredinattributes.asp[/url](статья "[bold]Retrieving Information Stored in Attributes[/bold]").Сам спросил - сам ответил ;)</description><pubDate>Tue, 11 Apr 2006 17:14:00 GMT</pubDate><dc:creator>Comanche</dc:creator></item><item><title>Десериализация и DefaultValueAttribute</title><link>http://www.relib.com/forums/Topic895013-16-1.aspx</link><description>Допустим, имею класс с двумя свойствами: [quote]    &lt;DefaultValueAttribute(5)&gt; _     Public Property IntProp() As Integer         Get             IntProp = c_IntProp         End Get         Set(ByVal value As Integer)             c_IntProp = value         End Set     End Property     &lt;DefaultValueAttribute("Вася")&gt; _     Public Property StrProp() As String         Get             StrProp = c_StrProp         End Get         Set(ByVal value As String)             c_StrProp = value         End Set     End Property[/quote]Как видите, у каждого из свойств установлено дефолтное значение. Поэтому, когда я сериализую (через XmlSerializer и FileStream) экземпляр этого класса, то в итоговый XML-файл попадают только те свойства, значения которых [bold]отличаются[/bold] от дефолтных. Например, если IntProp = 123 (не равно 5), а StrProp = "Вася" (совпадает с дефолтом), то XML будет выглядеть так: [quote]&lt;?xml version="1.0"?&gt; &lt;TestClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;   &lt;IntProp&gt;123&lt;/IntProp&gt; &lt;/TestClass&gt;[/quote]т.е. StrProp в него не попадает. Что ж, так и задумано. Однако, когда я выполняю [underline]десериализацию[/underline] из этого XML-файла, то StrProp получит пустое значение, - если только в конструкторе класса нет явной инициализации свойства StrProp в строку "Вася". Получается, что дефолтные значения нужно указывать в ДВУХ местах: в атрибутах [bold]DefaultValueAttribute[/bold] и в коде конструктора. С одной стороны, это логично: атрибуты - это [bold]метаданные[/bold], а конструктор - это [bold]код[/bold]. Но с другой стороны, очень хоцца сказать конструктору: [italic]"А ну-ка возьми-ка начальные значения всех членов класса из метаданных! чтоб мне любимому дважды не писАть!"...[/italic] вопрос в том, КАК это сделать? как заставить конструктор проинициализировать экземплярные члены класса значениями из соотв. атрибутов [bold]DefaultValueAttribute[/bold]?!</description><pubDate>Tue, 11 Apr 2006 16:33:00 GMT</pubDate><dc:creator>Comanche</dc:creator></item></channel></rss>