Почему статическое поле класса, которое не сериализуемо, генерирует исключение NotSerializableException при сериализации экземпляра? - PullRequest
0 голосов
/ 24 октября 2018

В 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();
    }
}

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Scala не имеет понятия static полей.Вы можете «думать» о членах объекта A как о static в Java.

Ключевые слова являются «похожими на статические» и фактически не являются static.

Объект 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]()
0 голосов
/ 24 октября 2018

Примеры не эквивалентны.В примере Java вы сериализуете экземпляр Stu, сериализация пропустит поля static, поскольку они не являются частью состояния экземпляра.В примере Scala вы сериализуете экземпляр объекта AStudent, который имеет поле map.Поскольку Scala не имеет понятия static, Java-эквивалент будет:

public class AStudent implements Serializable {
  public Map map = new WeakHashMap();    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...