首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Scala中使用Java的Externalizable类在子类上返回不同的结果

在Scala中使用Java的Externalizable类在子类上返回不同的结果
EN

Stack Overflow用户
提问于 2014-03-03 12:04:27
回答 1查看 514关注 0票数 1

如果我想在Scala类中使用Java的Externalizable接口,没问题,

代码语言:javascript
复制
  import java.io.Externalizable
  import java.io.ObjectInput
  import java.io.ObjectOutput

  class ExternalizableTestClass(
    var str: String = "",
    var int: Int = 52
  )
  extends Externalizable
  {
    // Scala version of null constructor for Externalizeable.
    def this() = this("null construction value", 52)
    
    override def toString : String
      = "ExternalizableTestClass(str:" + str + ", int:" + int + ')'

    override def writeExternal(out: ObjectOutput)  {
      out.writeUTF(str)
      out.writeInt(int)
    }

    override def readExternal(in: ObjectInput) {
      str = in.readUTF()
      int = in.readInt()
    }
  }

它还将通过外部化携带数据。通过一个外化/去外化试验台来运行,

代码语言:javascript
复制
val obj = new ExternalizableTestClass("ohh", 87)

返回,

去外化后的对象: ExternalizableTestClass(str:ohh,int:87)

一切都很好。

然后添加一个子类,

代码语言:javascript
复制
  class ExternalizableTestSubclass(
    str: String = "",
    int: Int = 64
  )
  extends ExternalizableTestClass (
    str,
    int
  )
  with Externalizable
  {
    def this() = this("subclass null construction value", 74)
    override def writeExternal(out: ObjectOutput)  {
      // Java way to externalize if there is a subclass
      super.writeExternal(out)
    }

    override def readExternal(in: ObjectInput) {
      // Java way to externalize if there is a subclass
      super.readExternal(in)
    }
  }

它还将通过外部化携带数据。通过一个外化/去外化试验台来运行,

代码语言:javascript
复制
val obj = new ExternalizableTestSubclass("ohh", 87)

返回,

去外化后的对象: ExternalizableTestClass(str:ohh,int:87)

注意,我们没有看到任何空构造值(正如我可能希望的那样,外部性代码正在填充类)。

很少使用没有变化的子类,所以让它做一些事情;在超类中添加一个抽象方法,在子类中实现,使它成为一个toString,这样我们就可以看到发生了什么,

代码语言:javascript
复制
  abstract class ExternalizableTestClass(
    var str: String = "",
    var int: Int = 52
  )
  extends Externalizable
  {
    def this() = this("null construction value", 52)
    
    override def toString : String
      = "ExternalizableTestClass(str:" + str + ", int:" + int + ')'

    def methodVariedBySubclass : String
    
    override def writeExternal(out: ObjectOutput)  {
      out.writeUTF(str)
      out.writeInt(int)
    }

    override def readExternal(in: ObjectInput) {
      str = in.readUTF()
      int = in.readInt()
    }
  }

  class ExternalizableTestSubclass(
    str: String = "",
    int: Int = 64
  )
  extends ExternalizableTestClass (
    str,
    int
  )
      with Externalizable
  {
    def this() = this("subclass null construction value", 74)
    
    def methodVariedBySubclass : String
      = "ExternalizableTestSubclass(str:" + str + ", int:" + int + ')'

    override def writeExternal(out: ObjectOutput)  {
      super.writeExternal(out)
    }

    override def readExternal(in: ObjectInput) {
      super.readExternal(in)
    }
  }

通过序列化/反序列化测试平台运行此操作,

代码语言:javascript
复制
val obj = new ExternalizableTestSubclass("ohh", 87)

返回,

去外化后的对象: ExternalizableTestClass(str:ohh,int:87) 使用methodVariedBySubclass: ExternalizableTestSubclass去外部化对象之后(str:subclass空构造值,int:74)

哦,亲爱的。基上定义的toString()方法与预期的一样,但是方法methodVariedBySubclass() ( toString())返回的是空参数。

您可能想知道,序列化之前的情况是什么?答案:

在去外化对象之前: ExternalizableTestClass(str:ohh,int:87),然后用methodVariedBySubclass: ExternalizableTestSubclass(str:ohh,int:87)去外部化对象。

阿。

有人来过吗?加入一些内幕消息?

(我尝试过一些变体,看看它们是否暴露了任何机制。使超类不可外化,并从子类调用返回相同的不同结果。)

EN

回答 1

Stack Overflow用户

发布于 2014-03-05 12:59:04

哈,我有个答案。这与可扩展或Scala的缩写构造函数(或内部类,或名称-mangling)无关。这是标识符的冲突,欺骗Scala编译器。重命名基类(或子类)中的所有标识符。你可以参考这个问题的答案,

Scala style guideline for underscore in identifiers

对于任何感兴趣的人,通过这种调整,以上都是工作代码。

请记住,在Scala中,所有Java序列化技术(我都知道)都是可用的或可以提供的,

https://github.com/eishay/jvm-serializers/wiki

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22146302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档