DefaultValue влияет на сериализацию, если во время выполнения свойство имеет значение, совпадающее с тем, что говорит DefaultValue, тогда XmlSerializer не будет фактически записывать этот элемент (так как это значение по умолчанию).
Я не былНе уверен, повлияет ли это на значение по умолчанию при чтении, но в быстром тесте этого не происходит.В вашем сценарии я бы, вероятно, просто сделал его свойством с полем поддержки с инициализатором поля, которое делает его «истинным».ИМХО, мне нравится этот подход лучше, чем ctor, так как он отделяет его от ctors, которые вы делаете или не определили для класса, но это та же цель.
using System;
using System.ComponentModel;
using System.Xml.Serialization;
using System.IO;
class Program
{
static void Main(string[] args)
{
var serializer = new XmlSerializer(typeof(Testing));
string serializedString;
Testing instance = new Testing();
using (StringWriter writer = new StringWriter())
{
instance.SomeProperty = true;
serializer.Serialize(writer, instance);
serializedString = writer.ToString();
}
Console.WriteLine("Serialized instance with SomeProperty={0} out as {1}", instance.SomeProperty, serializedString);
using (StringReader reader = new StringReader(serializedString))
{
instance = (Testing)serializer.Deserialize(reader);
Console.WriteLine("Deserialized string {0} into instance with SomeProperty={1}", serializedString, instance.SomeProperty);
}
Console.ReadLine();
}
}
public class Testing
{
[DefaultValue(true)]
public bool SomeProperty { get; set; }
}
Как я уже упоминал в комментарии,на странице атрибутов сериализации xml (http://msdn.microsoft.com/en-us/library/83y7df3e.aspx) утверждает, что DefaultValue действительно заставит сериализатор установить значение, когда оно отсутствует, но в этом тестовом коде это не выполняется (аналогично приведенному выше, но просто десериализуется 3 входа).
using System;
using System.ComponentModel;
using System.Xml.Serialization;
using System.IO;
class Program
{
private static string[] s_inputs = new[]
{
@"<?xml version=""1.0"" encoding=""utf-16""?>
<Testing xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" />",
@"<?xml version=""1.0"" encoding=""utf-16""?>
<Testing xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">
<SomeProperty />
</Testing>",
@"<?xml version=""1.0"" encoding=""utf-16""?>
<Testing xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">
<SomeProperty>true</SomeProperty>
</Testing>",
};
static void Main(string[] args)
{
var serializer = new XmlSerializer(typeof(Testing));
foreach (var input in s_inputs)
{
using (StringReader reader = new StringReader(input))
{
Testing instance = (Testing)serializer.Deserialize(reader);
Console.WriteLine("Deserialized string \n{0}\n into instance with SomeProperty={1}", input, instance.SomeProperty);
}
}
Console.ReadLine();
}
}
public class Testing
{
[DefaultValue(true)]
public bool SomeProperty { get; set; }
}