我有一个我想在Hadoop中使用的第三方类,因此需要让它实现Writable
。问题是Hadoop使用Writable
的方式是创建一个对象o = SomeObject()
,然后调用o.readFields(in)
来反序列化,在我的情况下我不能创建空对象:
public abstract class Cube {
protected final int size;
protected Cube(int size) { this.size = size; }
}
注意size
为final
。
public class RealCube {
public Cube(int size) { super(size); }
}
这里RealCube
只有一个超级构造函数要调用,而construtor在抽象超类中设置final
变量。
public class RealCubeWritable implements Writable {
public void readFields(DataInput in) {
/* yikes! need to set the size */
}
}
当我们开始尝试实施RealCubeWritable
时,我无法拥有RealCubeWritable()
构造函数,并且在检查size
流之前我无法知道实际的DataInput
。
因此,似乎在Hadoop中执行此操作的唯一方法是使用包装器。我想知道的是,是否有办法使用包装器,但RealCubeWritable
仍然表现得像RealCube
?我已经研究过使用动态代理类,但我不确定这是否可行(或者如何实际执行)。
谢谢!
答案 0 :(得分:1)
如果你真的无法控制Cube对象,那么我不确定你有很多(愉快的)选择:
size
的域名是否相对较小? (即它只能是有限的一组/值范围)。如果是这样,您可以为每个有效大小值创建RealCube实例,并再次使用自定义序列化实现,根据从输入流中读取的大小选择正确的Cube实例