XML Serialize boolean как 0 и 1

Часть 2 схемы XML указывает, что экземпляр типа данных, который определен как логический, может иметь следующие допустимые литералы {true, false, 1, 0}. Следующий XML, например, при десериализации устанавливает для логического свойства «Эмулировать» значение true.

<root>
    <emulate>1</emulate>
</root>

Однако, когда я сериализую объект обратно в XML, я получаю true вместо числового значения. Мой вопрос: есть ли способ контролировать логическое представление в XML?

Возможно, вы захотите упомянуть, что вы используете для сериализации XML.

Darrel Miller 17.09.2008 19:30

Дополнительный вопрос по той же теме на CoreReview.SE

MPelletier 08.05.2014 18:33
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
25
2
22 476
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Нет, не использовать System.Xml.XmlSerializer по умолчанию: вам нужно будет изменить тип данных на int, чтобы добиться этого, или возиться с предоставлением собственного кода сериализации (возможно, но не очень весело).

Однако вы можете просто постобработать сгенерированный XML вместо этого, конечно, либо с помощью XSLT, либо просто с помощью подстановки строк. Немного хака, но довольно быстро, как во время разработки, так и во время выполнения ...

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

Вы можете реализовать IXmlSerializable, который позволит вам изменять сериализованный вывод вашего класса, как вы хотите. Это повлечет за собой создание трех методов GetSchema (), ReadXml (XmlReader r) и WriteXml (XmlWriter r). Когда вы реализуете интерфейс, эти методы вызываются вместо того, чтобы .NET пыталась сериализовать сам объект.

Примеры можно найти по адресу:

http://www.developerfusion.co.uk/show/4639/ и

http://msdn.microsoft.com/en-us/library/system.xml.serialization.ixmlserializable.aspx

Да, я надеялся этого избежать, но, похоже, у меня здесь нет особого выбора. Спасибо :)

Igal Tabachnik 17.09.2008 19:33

Вы также можете сделать это, используя некоторую черную магию атрибута XmlSerializer:

[XmlIgnore]
public bool MyValue { get; set; }

/// <summary>Get a value purely for serialization purposes</summary>
[XmlElement("MyValue")]
public string MyValueSerialize
{
    get { return this.MyValue ? "1" : "0"; }
    set { this.MyValue = XmlConvert.ToBoolean(value); }
}

Вы также можете использовать другие атрибуты, чтобы скрыть этого члена от intellisense, если он вас оскорбляет! Это не идеальное решение, но оно может быть быстрее, чем реализация IXmlSerializable.

Это ужасно, но решает проблему точно! Проголосуйте только за то, что я угрожаю краткосрочным удержанием моего завтрака.

Tom W 21.02.2012 12:27

Это именно то, что я искал! Большое спасибо, я думал, что никогда не смогу хранить логические значения в XML как «истина» и «ложь».

Alex 28.02.2013 14:37

Не лучший ответ: теперь у вас есть два объекта недвижимости вместо одного. Я нашел здесь гораздо более чистое решение: stackoverflow.com/questions/5963423/… В двух словах, создайте новый класс / структуру, которая реализует IXmlSerializable.

Fl4v 25.01.2018 17:23

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