Интересный;Я никогда не замечал этого в прошлом, но это определенно воспроизводимо.Поскольку XmlSerializer
не поддерживает обратные вызовы сериализации (чтобы вы знали, что он работает для сериализации), на это трудно повлиять;возможно, самый простой ответ - «не помещайте данные по умолчанию в объекты в конструкторе» (хотя, возможно, предложите фабричный метод, который делает это).
Вы можете попытаться реализовать IXmlSerializable
, но это слишком сложно сделать правильно, даже для простого примера.
Я проверил, однако, и DataContractSerializer
не ведет себя таким образом - так что вы могли бы, возможно, переключиться наDataContractSerializer
;вот мой тестовый код с DCS:
DataContractSerializer ser =
new DataContractSerializer(typeof(Config));
using (Stream s = new MemoryStream())
{
ser.WriteObject(s, new Config());
s.Position = 0;
using(var writer = XmlWriter.Create(Console.Out)) {
ser.WriteObject(writer, ser.ReadObject(s));
}
}
и вот что я имею в виду под заводским методом:
public class Config
{
public Config()
{
Test1 = new List<string>();
Test2 = nix;
}
public List<string> Test1 { get; set; }
public string[] Test2 { get; set; }
private static readonly string[] nix = new string[0];
public static Config CreateDefault()
{
Config config = new Config();
config.Test1.Add("A");
config.Test1.Add("B");
config.Test2 = new string[2] { "A", "B" };
return config;
}
}