Какой самый простой способ заставить XmlSerializer также сериализовать частные и «общедоступные константные» свойства класса или структуры? Правильно, не все, что он будет выводить для меня, - это только публичные вещи. Если сделать его закрытым или добавить const, значения не будут сериализованы.
По определению открытые (то есть общедоступные и защищенные) константы - это то, что никогда не изменится. Изменение общедоступной константы - это критическое изменение клиента! Для чего-то, что является просто постоянным для выполнения приложения или для конкретной версии приложения, но может измениться в будущем, вам необходимо использовать поля readonly. XmlSerializer с ними тоже не справится, но это другое дело.
Если вы хотите сериализовать / десериализовать частные члены, см. stackoverflow.com/questions/420662/…





XmlSerializer просматривает только общедоступные поля и свойства. Если вам нужно больше контроля, вы можете реализовать IXmlSerializable и сериализовать все, что захотите. Конечно, сериализация константы не имеет особого смысла, поскольку вы не можете десериализовать ее до константы.
Ознакомьтесь с DataContractSerializer, представленным в .NET 3.0. Он также использует формат XML и во многих отношениях лучше, чем XmlSerializer, включая работу с личными данными. См. http://www.danrigsby.com/blog/index.php/2008/03/07/xmlserializer-vs-datacontractserializer-serialization-in-wcf/ для полного сравнения.
Если у вас только .NET 2.0, есть BinarySerializer, который может работать с личными данными, но, конечно, это двоичный формат.
«Лучше» является дискуссионным, например, DataContractSerializer не дает вам никакой гибкости в том, как сериализовать объект.
Нет смысла рассматривать членов const, поскольку они не относятся к каждому экземпляру; но если вы имеете в виду только непубличные члены экземпляра: рассмотрите DataContractSerializer (.NET 3.0) - это похоже на XmlSerializer, но может сериализовать непубличные свойства (хотя это «выбор»).
См. здесь для большего.
Сериализация значения константы для конкретной среды выполнения имеет много смысла, если, например, ее следует сравнить со значением в другой среде выполнения.
@Jesdisciple не совсем - потому что опять же: это сериализатор объекта (экземпляра), и это значение не принадлежит объекту (экземпляру).
Несмотря на то, что сериализовать частные свойства невозможно, вы можете сериализовать свойства с помощью внутреннего установщика, например этого:
public string Foo { get; internal set; }
Для этого вам необходимо предварительно сгенерировать сборку сериализации с помощью sgen.exe и объявить эту сборку как друга:
[assembly:InternalsVisibleTo("MyAssembly.XmlSerializers")]
Еще одно решение - использование Newtonsoft.Json:
var json = Newtonsoft.Json.JsonConvert.SerializeObject(new { root = result });
var xml = (XmlDocument)Newtonsoft.Json.JsonConvert.DeserializeXmlNode(json);
Конечно, этот, к сожалению, обходится через json.
Вот мое решение для помещения неизменяемых значений в свойство, которое будет сериализовано в XML:
[XmlElement]
public string format { get { return "Acme Order Detail XML v3.4.5"; } set { } }
Почему вы хотите сериализовать константы ?! Кажется, вы идете неправильным маршрутом.