2015-10-27 6 views
1

Я пытаюсь преобразовать объекты типа 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)?

ответ

0

Мне удалось сделать конвертер Option для маршалирования объектов в XML. (Часть чтения для меня не требуется, поэтому я оставил ее нереализованной)

import com.thoughtworks.xstream.converters.{MarshallingContext, UnmarshallingContext} 
import com.thoughtworks.xstream.io.{HierarchicalStreamReader, HierarchicalStreamWriter} 

private [xml] sealed class OptionConverter extends com.thoughtworks.xstream.converters.Converter { 

    override def marshal(source: scala.Any, writer: HierarchicalStreamWriter, context: MarshallingContext): Unit = { 
    val opt = source.asInstanceOf[Option[_]] 
    for (value <- opt) { 
     context.convertAnother(opt.get) 
    } 
    } 

    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) 
    } 
} 
+0

В случае отсутствия каких-либо ответов, я буду отмечать мои правильные - как кажется, работает :) –