Java 为什么不可序列化的类的静态字段在序列化实例时会引发NotSerializableException?
在scala中,我认为对象的字段是静态的,在序列化时不会序列化, 但如果该字段不可序列化,则会得到NotSerializableException。 为什么?类似的java代码也可以 下面是一个简单的例子 谢谢 Scala代码:Java 为什么不可序列化的类的静态字段在序列化实例时会引发NotSerializableException?,java,scala,serializable,Java,Scala,Serializable,在scala中,我认为对象的字段是静态的,在序列化时不会序列化, 但如果该字段不可序列化,则会得到NotSerializableException。 为什么?类似的java代码也可以 下面是一个简单的例子 谢谢 Scala代码: package test import java.io._ import java.util object AStudent extends Serializable { var name="Jack" val map=new util.WeakHashMa
package test
import java.io._
import java.util
object AStudent extends Serializable {
var name="Jack"
val map=new util.WeakHashMap
}
object SerializationDemo extends App {
val oos = new ObjectOutputStream(new FileOutputStream("./tmp/stu"))
println(AStudent.name)
AStudent.name=null
println(AStudent.name)
oos.writeObject(AStudent)
oos.close
}
Java代码:
package test;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.WeakHashMap;
public class Stu implements Serializable {
public static String name="Jack";
public static WeakHashMap map=new WeakHashMap();
public static void main(String[] args) throws IOException {
ObjectOutputStream oos= new ObjectOutputStream(new FileOutputStream("./tmp/stu"));
oos.writeObject(new Stu());
oos.close();
}
}
这些例子并不相同。在Java示例中,您正在序列化一个Stu实例,序列化将跳过静态字段,因为它们不是实例状态的一部分。在Scala示例中,您正在序列化具有映射字段的AStudent对象实例。由于Scala没有静态概念,因此Java等价物是:
public class AStudent implements Serializable {
public Map map = new WeakHashMap();
Scala没有静态字段的概念。您可以认为对象A的成员类似于Java中的静态对象
关键词被认为是类似于静态的,而不是实际上是静态的
对象AStudent将是匿名类AStudent.type的实例,并且对象AStudent的所有成员实际上都是类AStudent.type的成员
类似于,
class AStudentType[K, V](
var name: String ="Jack",
val map: WeakHashMap[K, V] = new WeakHashMap()
)
val AStudent = new AStudentType[String, String]()
通常,在询问异常时,您可能希望添加stacktrace。除此之外,请注意Scala代码和Java代码不应该是等价的,尽管我不太了解Scala,因为一个有实例字段,而另一个有类字段,也就是静态字段。Scala没有静态字段的概念。您可以认为对象A的成员类似于Java中的静态对象。关键词被认为是相似的,而不是实际上是静态的。对象AStudent将是匿名类AStudent.type的实例,并且对象AStudent的所有成员实际上都是类AStudent.type的成员。