2011-07-21 40 views
3

我有一個序列化java映射Map<UUID,String>的方法。它工作正常。我可以在java中序列化和反序列化。嘗試序列化從scala轉換的java映射時的非序列化異常

但我必須從scala調用這個方法,這是我的調用代碼。

def customSerialize:Unit = { 
Serializer.serialize(modMap(scalaMap)) 

def modMap(oldMap : Map[UUID,SomeObject]) : java.util.Map[UUID,java.lang.String] = { 
     oldMap map { case(k,v) => (k->v.name)} 
} 

斯卡拉地圖是scala.collection.Map,我使用import scala.collection.JavaConversions._做轉換。

當我運行這段代碼我得到錯誤

java.io.NotSerializableException: scala.collection.JavaConversions$MapWrapper 
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1180) 
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346) 

它看起來像我需要多一個轉換,從javaconversions$MapWrapperjava.util.Map。它是否正確?有沒有辦法做到這一點?

+0

現在我在我的java代碼中添加一個額外的轉換方法,我遍歷scala提供的Map並創建一個新的Java Map。我希望有更好的方法來做到這一點。 –

+0

這仍然是一個問題,所以我打開了一個問題:https://issues.scala-lang.org/browse/SI-8911 –

回答

1

個人而言,我會打開一個增強的問題,要求這些包裝可序列化。不是說它會在短期內幫助你,但...

你試過JavaConverters的東西嗎?

1

據我所知,你確實需要複製地圖,因爲MapWrapper是不可序列化的。最好的是Scala支持這一點,但同時合理的語法只是使用Java Map的複製構造函數。你的電話會看起來像這樣:

Serializer.serialize(new java.util.HashMap(modMap(scalaMap))) 
相關問題