我正在關注scala object serialization 的基本示例。但是,在運行以下單元測試時package mytestimport java.io.{ByteArrayOutputStream, ObjectOutputStream}import org.scalatest.{Matchers, WordSpec}class BasicSerializationSpec extends WordSpec with Matchers { @SerialVersionUID(123L) class TestRecord(var content: String) extends Serializable { override def toString = s"TestRecord($content)" } "A TestRecord" should { "be serializable" in { val oo = new ObjectOutputStream(new ByteArrayOutputStream()) val tr = new TestRecord("42") oo.writeObject(tr) oo.close } }}我得到一個例外:org.scalatest.Assertions$AssertionsHelper java.io.NotSerializableException:在 java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548) 在 java.io.ObjectOutputStream 的 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)。 writeSerialData(ObjectOutputStream.java:1509) 在 java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) 在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) 在 java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java :1548) 在 java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509) 在 java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) 在 java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) 在 java .io。ObjectOutputStream.writeObject(ObjectOutputStream.java:348) 在 mytest.BasicSerializationSpec.$anonfun$new$2(BasicSerializationSpec.scala:20)我試圖明確設置類型val tr : java.io.Serializable = new TestRecord("42")但仍然沒有運氣。如何正確地將 scala 對象序列化為 java ObjectOutputStream?這不是其他堆棧答案的重復,因為我顯然在擴展Serializable我的類聲明。預先感謝您的考慮和回復。
1 回答

慕仙森
TA貢獻1827條經驗 獲得超8個贊
序列化內部類在 Java 和 Scala 中都是一個雷區,但是如果在您的真實代碼中沒有對 中BasicSerializationSpec
的成員的引用TestRecord
,您應該能夠通過final
在內部類定義中添加修飾符來完成這項工作:
final class TestRecord(var content: String) extends Serializable {
在實際代碼中,您不太可能測試您在測試類中定義的類,但在測試內部類時可能會遇到類似情況。
添加回答
舉報
0/150
提交
取消