Использование XmlSerializer с закрытыми и общедоступными константными свойствами

Какой самый простой способ заставить XmlSerializer также сериализовать частные и «общедоступные константные» свойства класса или структуры? Правильно, не все, что он будет выводить для меня, - это только публичные вещи. Если сделать его закрытым или добавить const, значения не будут сериализованы.

Почему вы хотите сериализовать константы ?! Кажется, вы идете неправильным маршрутом.

mmx 09.01.2009 22:36

По определению открытые (то есть общедоступные и защищенные) константы - это то, что никогда не изменится. Изменение общедоступной константы - это критическое изменение клиента! Для чего-то, что является просто постоянным для выполнения приложения или для конкретной версии приложения, но может измениться в будущем, вам необходимо использовать поля readonly. XmlSerializer с ними тоже не справится, но это другое дело.

Pavel Minaev 29.07.2009 01:51

Если вы хотите сериализовать / десериализовать частные члены, см. stackoverflow.com/questions/420662/…

Andrew Hare 09.01.2009 22:45
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
3
22 779
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

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 не дает вам никакой гибкости в том, как сериализовать объект.

nicodemus13 14.03.2012 14:23

Нет смысла рассматривать членов const, поскольку они не относятся к каждому экземпляру; но если вы имеете в виду только непубличные члены экземпляра: рассмотрите DataContractSerializer (.NET 3.0) - это похоже на XmlSerializer, но может сериализовать непубличные свойства (хотя это «выбор»).

См. здесь для большего.

Сериализация значения константы для конкретной среды выполнения имеет много смысла, если, например, ее следует сравнить со значением в другой среде выполнения.

Grault 15.12.2014 23:43

@Jesdisciple не совсем - потому что опять же: это сериализатор объекта (экземпляра), и это значение не принадлежит объекту (экземпляру).

Marc Gravell 16.12.2014 11:09

Несмотря на то, что сериализовать частные свойства невозможно, вы можете сериализовать свойства с помощью внутреннего установщика, например этого:

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 { } }

Другие вопросы по теме