メソッドObjectOutputStream.writeStreamHeader()
をオーバーライドして、データをヘッダーの先頭または末尾に追加できます。ただし、そのデータが次のような派生クラスのコンストラクターに渡される引数に基づいている場合:
public class MyObjectOutputStream extends ObjectOutputStream {
public MyObjectOutputStream( int myData, OutputStream out ) throws IOException {
super( out );
m_myData = myData;
}
protected void writeStreamHeader() throws IOException {
write( m_myData ); // WRONG: m_myData not initialized yet
super.writeStreamHeader();
}
private final int m_myData;
}
が初期化されて呼び出さsuper()
れる前に呼び出されるため、機能しません。これを回避する唯一の方法は、次のように使用することです。m_myData
super()
writeStreamHeader()
ThreadLocal
public class MyObjectOutputStream extends ObjectOutputStream {
public MyObjectOutputStream( int myData, OutputStream out ) throws IOException {
super( thunk( myData, out ) );
}
protected void writeStreamHeader() throws IOException {
write( m_myData.get().intValue() );
super.writeStreamHeader();
}
private static OutputStream thunk( int myData, OutputStream out ) {
m_myData.set( myData );
return out;
}
private static final ThreadLocal<Integer> m_myData = new ThreadLocal<Integer>();
}
これは機能しているように見えますが、より良い (不格好でない) 方法はありますか?