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>();
}
这似乎可行,但是有更好(不那么笨重)的方法吗?