Scala中XStream的选项转换器
我正在尝试使用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
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(在没有更多答案的情况下,我将我的答案标记为正确-因为它似乎有效:)