可以重写方法ObjectOutputStream.writeStreamHeader()
以将数据预加或附加到标题。但是,如果该数据是基于一个参数传递给派生类的构造函数,如:如何覆盖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;
}
这是行不通的,因为之前m_myData
初始化和super()
电话writeStreamHeader()
super()
被调用。我能想到的唯一的办法来解决,这是通过使用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>();
}
这似乎是工作,但有一个更好的(不太笨重)的方式?
这比使用ThreadLocal更笨拙 – dfa 2009-07-06 07:46:02
这是如何笨重?构图非常优雅。唯一的问题是所有的样板代码(方法体),因为Java缺乏代表的好语法。但是Eclipse可以自动生成它们。 – Thilo 2009-07-06 07:48:34
@Thilo,我宁愿你的解决方案使用流组合 – dfa 2009-07-06 07:51:41