Я пытаюсь преобразовать объекты типа Option[T]
в XML с помощью Xstream в Scala. У меня есть случай класса, как это:Преобразователь опций для XStream в Scala
case class MyModel(promos: Option[Promos])
Если опция Some(Promo)
, я хотел бы, чтобы оказать
<MyModel>
<Promos>
<promoField1>value</promoField1>
<promoField2>value</promoField2>
</Promos>
</MyModel>
Если опция None
, я хотел бы, чтобы оказать
<MyModel>
<Promos/>
</MyModel>
до сих пор в моем решении, я зарегистрировал нейтрализатор:
xstream.registerConverter(new OptionConverter(xstream.getMapper))
Я тогда пользовательский конвертер, который выглядит следующим образом:
private [xml] class OptionConverter(_mapper: Mapper) extends AbstractCollectionConverter(_mapper: Mapper) {
override def marshal(source: scala.Any, writer: HierarchicalStreamWriter, context: MarshallingContext): Unit = {
val opt = source.asInstanceOf[Option[_]]
for (value <- opt) {
writeItem(value, context, writer)
}
}
override def unmarshal(reader: HierarchicalStreamReader, context: UnmarshallingContext): AnyRef = {
throw new UnsupportedOperationException
}
override def canConvert(clazz: Class[_]): Boolean = {
clazz.isAssignableFrom(classOf[Some[_]]) || clazz.isAssignableFrom(None.getClass)
}
}
None
работает отлично, но Some(promo)
выходы, как это:
<Promos>
<com.mymodel.Promos>
<promoField1>value</promoField1>
<promoField2>value</promoField2>
</com.mymodel.Promos>
</Promos>
Проблема в том, Promos выводится наружу для моего Option/Some
поле «com.mymodel.Promos» затем выводится для вложенного значения в пределах Some
. Есть ли способ сгладить для Some(value)
?
В случае отсутствия каких-либо ответов, я буду отмечать мои правильные - как кажется, работает :) –