Проблема с десериализацией для Scala.Symbol в версии Scala 2.12, для Scala.Symbol Serialized в Scala 2.11

import java.io. {FileInputStream, FileOutputStream, ObjectInputStream, ObjectOutputStream}
object SymbolSerializeDemo {
  def main(args: Array[String]): Unit = {
    val fileName = "file.ser"
    val symbolCheck: Symbol = Symbol("someSymbol")
    //serializeToFile(symbolCheck, fileName)
    deserializeFromFile(fileName)
  }
  private def serializeToFile(input: Symbol, fileName: String): Unit = {
    try {
      val file: FileOutputStream = new FileOutputStream(fileName)
      val out: ObjectOutputStream = new ObjectOutputStream(file)
      out.writeObject(input)
    }
  }
  private def deserializeFromFile(fileName: String): Unit = {
    try {
      val file: FileInputStream = new FileInputStream(fileName)
      val input: ObjectInputStream = new ObjectInputStream(file)
      val output = input.readObject.asInstanceOf[Symbol]
      println("Symbol after deseralization " + output.name)
    }
  }
}

Я пытаюсь десериализовать scala-символ, сериализованный в scala 2.11, но получаю сообщение об ошибке java.io.InvalidClassException: scala.Symbol; local class incompatible: stream classdesc serialVersionUID = 2966401305346518859, local class serialVersionUID = 6865603221856321286 Можем ли мы написать собственную сериализацию для этого или любого другого варианта?

Я попытался добавить serialVersionUID для класса, а также для символа

Зачем тебе это нужно? Почему вы не можете десериализовать в той же версии, в которой она была сериализована?

Dmytro Mitin 16.11.2022 15:40

Мы работаем над миграцией устаревшего проекта, когда мы перезапускаем приложение, сервер сохраняет данные в сериализованной форме как точку восстановления. Мы не можем потерять эти данные. Мы выполнили миграцию, все работает нормально, за исключением класса, содержащего Scala.Symbol, который дает нам это исключение. Спасибо

user3771712 16.11.2022 16:15

Есть ли шанс, что вы могли бы сначала преобразовать Symbol в String?

Gaël J 16.11.2022 18:30

Нет @GaëlJ, символ используется во многих местах.

user3771712 17.11.2022 05:07

Может быть, получить java-код класса Symbol, сгенерированный для Scala 2.11, и скопировать/вставить его с другим именем в свой проект? Не уверен, что это может сработать.

Gaël J 17.11.2022 07:12
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
128
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Можно ли запустить Scala 2.11 из Scala 2.12 для десериализации или это будет слишком медленно?

// Scala 2.12
import sys.process._

Symbol("scala-2.11.12/bin/scala path_to_deserializer/Deserializer.scala path_to_file/file.ser".!!)
// 'someSymbol
// Deserializer.scala
import java.io.{FileInputStream, ObjectInputStream}

object Deserializer {
  def main(args: Array[String]): Unit = {
    deserializeFromFile(args(0))
  }

  private def deserializeFromFile(fileName: String): Unit = {
    val file: FileInputStream = new FileInputStream(fileName)
    val input: ObjectInputStream = new ObjectInputStream(file)
    val output = input.readObject.asInstanceOf[Symbol]
    println(output.name)
  }
}

Привет Дмитрий, спасибо за информацию. Это решение может работать для этого примера, однако в проекте мы не сможем этого сделать. В проекте сервер Akka выполняет сериализацию и десерализацию. Мы не можем заставить сервер akka делать это таким образом. Я привел этот пример, чтобы понять проблему. В настоящее время я проверяю пользовательскую сериализацию. Спасибо

user3771712 17.11.2022 08:19

@ user3771712 Почему?

Dmytro Mitin 17.11.2022 08:19

Кроме того, когда akka сериализует объект, он будет иметь не только символы, но и классы case, список и т. д.

user3771712 17.11.2022 08:25

Привет, Дмитрий, case class Mobile(name: String) case class Notification(m: Mobile, s: Symbol) val n = Notification(Mobile("Apple"), Symbol("someSymbol")) Будет ли этот подход работать для десериализации " н" Спасибо.

user3771712 17.11.2022 13:52
Ответ принят как подходящий

Я исправил проблему, понизив версию scala с 2.12.17 до 2.12.6.

Другие вопросы по теме