Closed
Description
Minimized code
import java.io._
class Config(s: String)
class ConfigException(@transient val config: Config = null)
extends java.io.Serializable {}
object Main {
def main(args: Array[String]): Unit = {
val e =
new ConfigException(new Config("not serializable"))
val byteStream = new ByteArrayOutputStream()
val objectStream = new ObjectOutputStream(byteStream)
objectStream.writeObject(e)
objectStream.close()
val bytes = byteStream.toByteArray()
val inStream = new ByteArrayInputStream(bytes)
val inObjectStream = new ObjectInputStream(inStream)
val copy = inObjectStream.readObject()
inObjectStream.close()
}
}
Output
sbt:dotty-simple> run
[info] Compiling 1 Scala source to /Users/eric/workspace/dotty-test/target/scala-0.27/classes ...
[info] running Main
[error] (run-main-1a) java.io.NotSerializableException: Config
[error] java.io.NotSerializableException: Config
[error] at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
[error] at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
[error] at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
[error] at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
[error] at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
[error] at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
[error] at Main$.main(Main.scala:15)
[error] at Main.main(Main.scala)
[error] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[error] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[error] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[error] at java.lang.reflect.Method.invoke(Method.java:498)
[error] stack trace is suppressed; run last Compile / bgRun for the full output
[error] Nonzero exit code: 1
[error] (Compile / run) Nonzero exit code: 1
[error] Total time: 0 s, completed Sep 25, 2020 11:33:00 AM
sbt:dotty-simple>
Expectation
In Scala 2, serialization avoids the @transient val
so I am thinking it should avoid in Scala 3 too.
Note: If the @transient val or var
is in the body of the class, Scala 3 does not try to serialize.