簡體   English   中英

單身對象的Scala序列化/反序列化

[英]Scala serialization/deserialization of singleton object

我對Scala編程語言很陌生,目前需要執行以下操作。 我有一個如下的signleton對象:

object MyObject extends Serializable {
    val map: HashMap[String, Int] = null
    val x: int = -1;
    val foo: String = ""
}

現在,我要避免不必分別序列化此對象的每個字段,因此我正在考慮將整個對象寫入文件,然后在程序的下一次執行中,讀取文件並從那里初始化單例對象。 有什么辦法嗎?

基本上我想要的是當序列化文件不存在時,那些變量要初始化為新結構,而當它存在時,要從文件中的字段初始化那些字段。 但我想避免手動對每個字段進行序列化/反序列化...

更新:

我必須使用此處提供的自定義反序列化器: https : //issues.scala-lang.org/browse/SI-2403 ,因為我在HashMap中將自定義類用作值時遇到了問題。

UPDATE2:

這是我用來序列化的代碼:

val store = new ObjectOutputStream(new FileOutputStream(new File("foo"))) 
store.writeObject(MyData) 
store.close

和要反序列化的代碼(在另一個文件中):

@transient private lazy val loadedData: MyTrait = {
    if(new File("foo").exists()) {
        val in = new ObjectInputStream(new FileInputStream("foo")) {
            override def resolveClass(desc: java.io.ObjectStreamClass): Class[_] = {
                try { Class.forName(desc.getName, false, getClass.getClassLoader) }
                catch { case ex: ClassNotFoundException => super.resolveClass(desc) }
            }
        }
        val obj = in.readObject().asInstanceOf[MyTrait] 
        in.close
        obj
    }
    else null
}

謝謝,

無需序列化僅具有不可變字段的對象(因為編譯器將為您完成此操作...)我將假定該對象提供默認值。 這是執行此操作的方法:

首先編寫具有所有必填字段的特征:

trait MyTrait {
  def map: HashMap[String, Int]
  def x: Int
  def foo: String
}

然后使用默認值編寫一個對象:

object MyDefaults extends MyTrait {
  val map = Map()
  val x = -1
  val foo = 
}

最后編寫一個實現反序列化數據(如果存在)的實現:

object MyData extends MyTrait {

  private lazy val loadedData: Option[MyTrait] = {
     if( /* filename exists */ ) Some( /*unserialize filename as MyTrait*/)
    else None
  }
  lazy val map = loadedData.getOrElse( MyDefault ).map
  lazy val x = loadedData.getOrElse( MyDefault ).x
  lazy val foo = loadedData.getOrElse( MyDefault ).foo

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM