将二进制文件中的对象保存到文件中,如何正确序列化?

时间:2015-10-23 10:21:24

标签: java scala serialization

我正在研究一个小型体素引擎,我正处于需要从缓存到文件系统编写世界某些部分的地步。

现在我有点困惑......我有这个:

@SerialVersionUID(1L)
class Chunk(val position: Vector3) extends Externalizable
{
  val blocks = Array.ofDim[Short](WIDTH, HEIGHT, DEPTH)
  private val mesh = new ChunkMesh(this)    

  override def readExternal(in: ObjectInput): Unit =
  {
    val x = in.readInt
    val y = in.readInt
    val z = in.readInt

    position.set(x,y,z)

    for
    {
      a <- 0 until blocks(0).length
      b <- 0 until blocks(1).length
      c <- 0 until blocks(2).length
    }
    {
      if(in.available() > 0) blocks(a)(b)(c) = in.readShort()
    }
  }

  override def writeExternal(out: ObjectOutput): Unit =
  {
    out.writeInt(position.x.toInt)
    out.writeInt(position.y.toInt)
    out.writeInt(position.z.toInt)

    for
    {
      a <- 0 until blocks(0).length
      b <- 0 until blocks(1).length
      c <- 0 until blocks(2).length
    }
      out.writeShort(blocks(a)(b)(c))
  }
}

现在根据这个:https://www.safaribooksonline.com/library/view/scala-cookbook/9781449340292/ch12s08.html这就足够了。

但是唉,我从一开始就这么认为:

  

java.io.InvalidClassException:world.Chunk;没有有效的构造函数

所以,添加一个默认构造函数......

class Chunk extends Externalizable
{
  var position: Vector3 = new Vector3(0,0,0)

  def this(position: Vector3) =
  {
    this()
    this.position = position
  }
  //...
}

位置已初始化,以避免NullPointerEexceptions中的readExternal。它也是一个var,所以它可以在实例化时设置。

现在我仍然在mesh上获得了无效指针,但我大部分时间都得到了:

  

java.io.EOFException的

期间readExternal

请指点我关于序列化的一些教程......我发现它只是像我一样,甚至更容易。我故意选择扩展Externizable,以便能够准确定义应该写入二进制文件的内容以及不应该写入的内容。

我最后一次手工序列化了几年,而且从未在Scala中。

1 个答案:

答案 0 :(得分:0)

您的问题可能是您没有公开的无参数构造函数。