Scala中XStream的选项转换器

Scala中XStream的选项转换器,scala,xstream,Scala,Xstream,我正在尝试使用Scala中的Xstream将Option[T]类型的对象转换为XML。我有这样一个案例类: case class MyModel(promos: Option[Promos]) private [xml] class OptionConverter(_mapper: Mapper) extends AbstractCollectionConverter(_mapper: Mapper) { override def marshal(source: scala.Any, w

我正在尝试使用Scala中的Xstream将
Option[T]
类型的对象转换为XML。我有这样一个案例类:

case class MyModel(promos: Option[Promos])
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)
  }
}
<Promos>
  <com.mymodel.Promos>
    <promoField1>value</promoField1>
    <promoField2>value</promoField2>
  </com.mymodel.Promos>
</Promos>
如果选项是
Some(Promo)
,我希望它呈现

<MyModel>
  <Promos>
    <promoField1>value</promoField1>
    <promoField2>value</promoField2>
  </Promos>   
</MyModel>
<MyModel>
  <Promos/>
</MyModel>
到目前为止,在我的解决方案中,我注册了一个转换器:

xstream.registerConverter(new OptionConverter(xstream.getMapper)) 
然后,我有一个自定义转换器,如下所示:

case class MyModel(promos: Option[Promos])
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)
  }
}
<Promos>
  <com.mymodel.Promos>
    <promoField1>value</promoField1>
    <promoField2>value</promoField2>
  </com.mymodel.Promos>
</Promos>

问题是,Promos正在为我的
选项/Some
字段输出,“com.mymodel.Promos”正在为
Some
中的嵌套值输出。有没有一种方法可以使
Some(value)
扁平化?

我设法使用
选项
转换器将对象封送到XML。(我不需要阅读部分,所以我没有实现)

import com.thoughtworks.xstream.converters.{MarshallingContext,UnmarshallingContext}
导入com.thoughtworks.xstream.io.{HierarchicalStreamReader,HierarchicalStreamWriter}
私有[xml]密封类选项转换器扩展com.thoughtworks.xstream.converters.Converter{
重写def封送(源:scala.Any,编写器:HierarchycalStreamWriter,上下文:封送上下文):单位={
val opt=source.asInstanceOf[Option[\u]]

for(在没有更多答案的情况下,我将我的答案标记为正确-因为它似乎有效:)