0

我有一個play-mongojack示例中的scala類。它工作正常。但是,當我試圖在Play ehcache中保存它時,它會拋出NotSerializableException。我怎樣才能讓這個類可序列化?Play 2.2 Scala class serializable for cache

class BlogPost(@ObjectId @Id val id: String, 
      @BeanProperty @JsonProperty("date") val date: Date, 
      @BeanProperty @JsonProperty("title") val title: String, 
      @BeanProperty @JsonProperty("author") val author: String, 
      @BeanProperty @JsonProperty("content") val content: String) { 
       @ObjectId @Id @BeanProperty var blogId: String = _ 
       @BeanProperty @JsonProperty("uploadedFile") var uploadedFile: Option[(String, String, Long)] = None 
} 

object BlogPost { 
    def apply(
     date: Date, 
     title: String, 
     author: String, 
     content: String): BlogPost = new BlogPost(date,title,author,content) 

    def unapply(e: Event) = 
     new Some((e.messageId, 
      e.date, 
      e.title, 
      e.author, 
      e.content, 
      e.blogId, 
      e.uploadedFile)) 

    private lazy val db = MongoDB.collection("blogposts", classOf[BlogPost], classOf[String]) 

    def save(blogPost: BlogPost) { db.save(blogPost) } 
    def findByAuthor(author: String) = db.find().is("author", author).asScala 
} 

保存到緩存:

var latestBlogs = List[BlogPost]() 
Cache.set("latestBlogs", latestBlogs, 30) 

它拋出一個異常:

[error] n.s.e.s.d.DiskStorageFactory - Disk Write of latestBlogs failed: 
java.io.NotSerializableException: BlogPost 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1183) ~[na:1.7.0_45] 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347) ~[na:1.7.0_45] 
    at java.util.ArrayList.writeObject(ArrayList.java:742) ~[na:1.7.0_45] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_45] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_45] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_45] 

編輯1: 我試圖擴展了可序列化的對象,這是行不通的。編輯2: vitalii的評論適合我。

class BlogPost() extends scala.Serializable {} 
+1

重複我的評論在這裏:請嘗試 'class BlogPost(...)extends Serializable {...' – vitalii

+0

btw,對象BlogPost不需要被Serializable來序列化類BlogPost的實例 – vitalii

回答

1

嘗試從Serializable派生BlogPost類或將其定義爲一個情況下類是通過默認序列化的。

+0

我試圖用Serializable擴展對象,它不起作用。我剛更新了這個問題。 – angelokh

+0

我不能使用案例類。它給了我一個錯誤。我認爲這是因爲已經定義的apply和unapply函數。 – angelokh

+1

不反對!你應該從Serializable擴展你的類 – vitalii