Intereting Posts
Techiniques для написания Android, iPad, iPhone-клиентов, использующих удаленные данные Аплодировать и телефонные звонки на Android Разрешены ли общие настройки в приложениях Android, когда пользователь обновляет приложение? Функция Chrome-Data Chrome включена в Crosswalk WebView? Добавить зависимость от плагина Android Cordova Нужно использовать клиент Team Foundation в Android Studio вероятные альтернативы / обходные пути? Невозможно создать новый проект в андроид-студии Как узнать длительность звуковой песни перед потоковой передачей? Как я могу добавить эффект водяного знака к изображению в Android? Установить границы карты с различными дополнениями Android PendingIntent FLAG_NO_CREATE не возвращает null Android, Как я могу узнать, что анимация закончена? Как получить привязанный к Android сервис, чтобы выжить при перезапуске конфигурации AudioFlinger не смог создать трек, статус: -22 Получить объект JSON из URL с помощью HTTPURLConnection на Android

Атрибут «пустой» не работает, как ожидалось, с помощью SimpleFramework

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

Поэтому мой класс выглядит так:

@Order(attributes = { "name" }) public class TypeNumber { @Attribute(required = false) protected String name; @Element(required = false) @Attribute(empty = "xsi:nil=\"true\"") protected BigDecimal value; //getter setter methods goes here } 

В случае пустого значения я ожидал выход:

 <field name="some_name"> <value xsi:nil="true"/> </field> 

Хотя фактический результат:

 <field name="some_name"/> 

Любая идея, почему пустой атрибут работает не так, как ожидалось? Или я делаю это неправильно?

Примечание. Я использую SimpleFramework XML с VisitorStrategy . Таким образом, нельзя использовать AnnotationStrategy . Также у меня есть пользовательский посетитель для чтения и записи узлов.

Вам понадобится пользовательский конвертер …

Сейчас ваши выходы:
<typeNumber name="original" value="10"/>
а также
<typeNumber name="original_empty" value="xsi:nil=&quot;true&quot;"/>

Давайте начнем!

Первое, что вам нужно сделать, это передать AnnotationStrategy конструктору вашей Persister:

Serializer serializer = new Persister(new AnnotationStrategy());

.. затем создайте собственный конвертер в своей модели:

 @Root(name = "TypeNumberFixed") @Order(attributes = {"name"}) @Convert(TypeNumberFixed.FixConverter.class) class TypeNumberFixed { @Attribute(required = false) protected String name; @Element(required = false, name = "value") protected BigDecimal value; public static class FixConverter implements Converter<TypeNumberFixed> { @Override public TypeNumberFixed read(InputNode inputNode) throws Exception { //Implement your own deConverter return null; } @Override public void write(OutputNode node, TypeNumberFixed value) throws Exception { node.setAttribute("name",value.name); OutputNode valueNode = node.getChild("value"); if (value.value != null) { valueNode.setValue(value.value.toPlainString()); } else { valueNode.setAttribute("xsi:nil", "true"); } } } } 

Это будет генерировать следующий вывод для пустых / непустых значений соответственно:

TypeNumberFixed.value = null :

 <TypeNumberFixed name="new_empty"> <value xsi:nil="true"/> </TypeNumberFixed> 

TypeNumberFixed.value = 30 :

 <TypeNumberFixed name="new"> <value>30</value> </TypeNumberFixed> 

Вот репо, если вам интересно.