6

このコード:

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>

代わりに私はこれが欲しいです:

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

これは、汎用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) )        
  }
}
4

2 に答える 2

2

質問を投稿して数秒後、答えが私に届きました。これは、アンマーシャルの実用的な実装です。

  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
  }
于 2009-11-18T04:02:31.910 に答える
1

空のリストのインスタンスは1つだけで、それはオブジェクトNilです。

于 2009-11-18T10:33:02.967 に答える