Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 如何让XStream很好地输出Scala列表?我可以写一个自定义转换器吗?_Generics_List_Scala_Xstream - Fatal编程技术网

Generics 如何让XStream很好地输出Scala列表?我可以写一个自定义转换器吗?

Generics 如何让XStream很好地输出Scala列表?我可以写一个自定义转换器吗?,generics,list,scala,xstream,Generics,List,Scala,Xstream,此代码: println(new XStream.toXML(List(1,2,3))) 生成以下XML: <scala.coloncolon serialization="custom"> <unserializable-parents/> <scala.coloncolon> <int>1</int> <int>2</int> <int>3</int>

此代码:

println(new XStream.toXML(List(1,2,3)))
生成以下XML:

<scala.coloncolon serialization="custom">
  <unserializable-parents/>
  <scala.coloncolon>
    <int>1</int>
    <int>2</int>
    <int>3</int>
    <scala.ListSerializeEnd/>
  </scala.coloncolon>
</scala.coloncolon>

1.
2.
3.
相反,我希望这样:

<list>
  <int>1</int>
  <int>2</int>
  <int>3</int>
</list>

1.
2.
3.
这与泛型java集合的序列化方式类似。最好的方法是什么

我已经实现了我自己的转换器,但我仍然停留在解组方法上,不清楚如何实例化空列表

class ListConverter( _mapper : Mapper )  extends AbstractCollectionConverter(_mapper) {
  /** Helper method to use x.getClass
   * 
   * See: http://scalide.blogspot.com/2009/06/getanyclass-tip.html
   */
  def getAnyClass(x: Any) = x.asInstanceOf[AnyRef].getClass

  def canConvert( clazz: Class[_]) = {       
    classOf[::[_]] == clazz
  }

  def marshal( value: Any, writer: HierarchicalStreamWriter, context: MarshallingContext) = {
    val list = value.asInstanceOf[List[_]]
    for ( item <- list ) {      
      writeItem(item, context, writer)
    }
  }

  def unmarshal( reader: HierarchicalStreamReader, context: UnmarshallingContext ) = {
    println(context.getRequiredType())
    var list : List[_] = createCollection(context.getRequiredType()).asInstanceOf[List[_]]
    while (reader.hasMoreChildren()) {
      reader.moveDown();
      val item = readItem(reader, context, list);
      list = item :: list
      reader.moveUp();
    }
    list
  }
}

object ListConverter {
  def configureXStream( stream: XStream ) = {
    stream.alias("list", classOf[::[_]])
    stream.registerConverter( new ListConverter(stream.getMapper) )        
  }
}
class ListConverter(\u-mapper:mapper)扩展了AbstractCollectionConverter(\u-mapper){
/**使用x.getClass的Helper方法
* 
*见:http://scalide.blogspot.com/2009/06/getanyclass-tip.html
*/
def getAnyClass(x:Any)=x.asInstanceOf[AnyRef].getClass
def canConvert(clazz:Class[])={
类别[::[]]==clazz
}
def marshal(值:Any,writer:hierarchycalstreamwriter,上下文:MarshallingContext)={
val list=值.asInstanceOf[list[\u]]

对于(item发布问题后的几秒钟,我得到了答案,以下是解组的一个工作实现:

  def unmarshal( reader: HierarchicalStreamReader, context: UnmarshallingContext ) = {
    var list : List[_] = Nil 
    while (reader.hasMoreChildren()) {
      reader.moveDown();
      val item = readItem(reader, context, list);
      list = list ::: List(item) // be sure to build the list in the same order
      reader.moveUp();
    }
    list
  }

空列表只有一个实例,那就是对象
Nil

你能详细说明一下吗?我看不出你的答案与你问的如何实例化空列表的问题有什么关联。我只是说只有一个空列表,那就是
Nil
。所以你需要参考它——就像你在e您在答案中显示的代码。