2012-03-29 30 views
0

我有一個第三方類,我試圖在Hadoop中使用,因此需要讓它實現Writable。問題是,Hadoop的使用Writable的方式是創建一個對象o = SomeObject(),然後調用o.readFields(in)反序列化,並在我的情況,我不能創建空的對象:將第三方類擴展爲Hadoop可使用代理書寫

public abstract class Cube { 
    protected final int size; 
    protected Cube(int size) { this.size = size; } 
} 

sizefinal

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?我研究過使用動態代理類,但我不確定這是否可行(或如何實際執行)。

謝謝!

回答

1

如果你真的有比魔方對象沒有控制的話,我不知道你有很多(愉快)選項:

  • 我不知道我明白你的包裝或代理對象是什麼意思 - 無論哪種方式最終是最終的,所以你需要創建一個班級的副本,沒有最終的標誌
  • 你可能能夠使用一個討厭的反射黑客讓你un-final大小字段,然後設置字段值也通過反射,但如果Cube在構造函數中初始化其他變量的大小,可能會導致一些未定義的行爲
  • Yo你可以編寫自己的Serialization類,這將允許你爲每個對象創建一個新的RealCube實例(不是最有效的,但它將工作)(而不是使用傳統的Hadoop對象重用)
  • 是域的size比較小? (即它只能是一個有限的數值/範圍)。如果是這樣,您可以爲每個有效大小值創建一個RealCube實例,再次使用自定義序列化實現,根據從輸入流中讀取的大小選擇正確的Cube實例
+0

控制多維數據集是可能的,這只是不受歡迎的,因爲這意味着我必須維護上游的變化。我認爲勝利是值得的 - 除了我提到的問題之外,還有很多不良的屬性,這會導致大量不必要的複製和分配。 我認爲反思的想法是我最初的想法。我真的不知道任何細節,但這似乎相關:http://docs.oracle.com/javase/1.3/docs/guide/reflection/proxy.html – 2012-03-29 02:47:04

+0

您只能使用代理與接口雖然,我仍然不知道這將如何解決你的「最終」問題 – 2012-03-29 02:49:48

+0

葉......感謝指針! – 2012-03-29 04:16:14