Позвольте мне подробно описать, что происходит.
Когда вызывается метод XmlSerializer Deserialize (), он создает новый объект, используя конструктор по умолчанию. Я полагаю, что к этому объекту не применяются атрибуты DefaultValueAttributes, поскольку предполагается, что ctor по умолчанию должен «лучше знать», как инициализировать значения по умолчанию. С этой точки зрения - это логично.
XmlSerializer не сериализует элементы, значения которых совпадают с отмеченными атрибутом DefaultValue. С некоторой точки зрения такое поведение обусловлено и логикой.
Но когда вы не инициализируете членов в ctor и не вызываете метод deserialize, XmlSerializer не видит соответствующего поля xml, но видит, что поле / свойство имеет DefaultValueAttribute, сериализатор просто оставляет такое значение (согласно предположение, что конструктор по умолчанию лучше знает, как инициализировать класс «по умолчанию»). И у тебя есть свои нули.
Решение
Чтобы инициализировать членов класса этими DefaultValueAttributes (иногда очень удобно иметь эти значения инициализации просто на месте), вы можете использовать такой простой метод:
public YourConstructor()
{
LoadDefaults();
}
public void LoadDefaults()
{
//Iterate through properties
foreach (var property in GetType().GetProperties())
{
//Iterate through attributes of this property
foreach (Attribute attr in property.GetCustomAttributes(true))
{
//does this property have [DefaultValueAttribute]?
if (attr is DefaultValueAttribute)
{
//So lets try to load default value to the property
DefaultValueAttribute dv = (DefaultValueAttribute)attr;
try
{
//Is it an array?
if (property.PropertyType.IsArray)
{
//Use set value for arrays
property.SetValue(this, null, (object[])dv.Value);
}
else
{
//Use set value for.. not arrays
property.SetValue(this, dv.Value, null);
}
}
catch (Exception ex)
{
//eat it... Or maybe Debug.Writeline(ex);
}
}
}
}
}
Этот "public void LoadDefaults ()" может быть оформлен как Расширение объекта или использоваться как некоторый статический метод вспомогательного класса.