Java 为什么不可序列化的类的静态字段在序列化实例时会引发NotSerializableException?

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

在scala中,我认为对象的字段是静态的,在序列化时不会序列化, 但如果该字段不可序列化,则会得到NotSerializableException。 为什么?类似的java代码也可以

下面是一个简单的例子

谢谢

Scala代码:

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的成员。