如果我想在Scala类中使用Java的Externalizable接口,没问题,
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()
}
}它还将通过外部化携带数据。通过一个外化/去外化试验台来运行,
val obj = new ExternalizableTestClass("ohh", 87)返回,
去外化后的对象: ExternalizableTestClass(str:ohh,int:87)
一切都很好。
然后添加一个子类,
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)
}
}它还将通过外部化携带数据。通过一个外化/去外化试验台来运行,
val obj = new ExternalizableTestSubclass("ohh", 87)返回,
去外化后的对象: ExternalizableTestClass(str:ohh,int:87)
注意,我们没有看到任何空构造值(正如我可能希望的那样,外部性代码正在填充类)。
很少使用没有变化的子类,所以让它做一些事情;在超类中添加一个抽象方法,在子类中实现,使它成为一个toString,这样我们就可以看到发生了什么,
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)
}
}通过序列化/反序列化测试平台运行此操作,
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)去外部化对象。
阿。
有人来过吗?加入一些内幕消息?
(我尝试过一些变体,看看它们是否暴露了任何机制。使超类不可外化,并从子类调用返回相同的不同结果。)
发布于 2014-03-05 12:59:04
哈,我有个答案。这与可扩展或Scala的缩写构造函数(或内部类,或名称-mangling)无关。这是标识符的冲突,欺骗Scala编译器。重命名基类(或子类)中的所有标识符。你可以参考这个问题的答案,
Scala style guideline for underscore in identifiers
对于任何感兴趣的人,通过这种调整,以上都是工作代码。
请记住,在Scala中,所有Java序列化技术(我都知道)都是可用的或可以提供的,
https://stackoverflow.com/questions/22146302
复制相似问题