1

I have an app that is deployed to Tomcat 7 and is currently clustered among two nodes. I am running into a small issue that occurs when the container tries to deserialize a class which has changed. The read and write methods should handle this gracefully, so I don't think that is the issue. As best I can tell setting serialVersionUID should solve the issue, but in my code I have it specified as -1 and in the error below that value seems to be ignored.

Exception:

java.io.InvalidClassException: common.user.User; local class incompatible: st ream classdesc serialVersionUID = 1828770465826288626, local class serialVersion UID = 6192552274218063887

Relevant part of Class definition:

case class User(
    var id: Long = 0l) extends SerialVersionUID(-1l) with KeyedEntity[Long] with Externalizable {

  def readExternal(in: ObjectInput) {
    id = in.readLong()
  }

  def writeExternal(out: ObjectOutput) {
    out.writeLong(id)
  }
}

I have also tried using the following instead of extending the abstract class (as per: http://www.scala-lang.org/node/259)

private val serialVersionUID = -1l

I get the same result. Is there something I am missing in how to properly Externalize a class with Scala?

jcern
  • 7,798
  • 4
  • 39
  • 47

1 Answers1

3

Check the docs for SerialVersionUID, it's an annotation, so you should use @SerialVersionUID(123) right before the class declaration.

Making it:

@SerialVersionUID(123)
case class User(
    var id: Long = 0l) extends KeyedEntity[Long] with Externalizable {
     ...
}
pedrofurla
  • 12,763
  • 1
  • 38
  • 49
  • Thank you, I'm not sure how I missed that. I made the change and can see that the serialVersionUID is being set correctly. Not sure why using the private val way wasn't working for me either, but hopefully this will take care of the issue. – jcern Oct 03 '12 at 15:08