Каков наилучший способ записи размера определенных объектов по мере их сериализации? Например, если объекты типа A, B, C сериализованы, запишите размер их сериализованных байтов. Мы можем получить размер всего графа объектов через getBytes, но мы хотели бы разбить его на то, что является самым большим вкладом в общий размер сериализованного размера.Записывать размер объектов по мере их сериализации?
ObjectOutputStream предлагает writeObjectOverride, но мы не хотим переписывать процесс сериализации. В упрощенных терминах нам нужно знать, когда мы сталкиваемся с определенным объектом до сериализации, записываем общее количество байтов текущего байта, а затем после его сериализации учитываем разницу в байтах. Похоже, что использование writeSerialData будет работать, но метод является закрытым.
Идеи?
Спасибо.
--- UPDATE ---
ответы/предложения ниже проницательные. Ниже я до сих пор. Дайте мне знать, что вы думаете. Благодарю.
// extend to get a handle on outputstream
MyObjectOutputStream extends ObjectOutputStream {
private OutputStream out;
public MyObjectOutputStream(out) {
super(out);
this.out = out;
}
public OutputStream getOut() {
return this.out;
}
}
// counter
public static class CounterOutputStream extends FilterOutputStream {
private int bytesWritten = 0;
...
public int getBytesWritten() {
return this.bytesWritten;
}
public void resetCounter() {
bytesWritten = 0;
}
private void update(int len) {
bytesWritten += len;
}
}
// go serialize
ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream oos = new MyObjectOutputStream(new CounterOutputStream(out, 1024));
// record serialized size of this class; do this for every interested class
public class MyInterestingObject {
...
private void writeObject(ObjectOutputStream out) throws IOException {
CounterOutputStream counter = null;
if (out instanceof MyObjectOutputStream) {
counter = (CounterOutputStream)((MyObjectOutputStream)out).getOut();
counter.resetCounter();
}
// continue w/ standard serialization of this object
out.defaultWriteObject();
if (counter != null) {
logger.info(this.getClass() + " bytes written: " + counter.getBytesWritten());
// TODO: store in context or somewhere to be aggregated post-serialization
}
}
}
Укажите, к какому языку программирования вы говорите, и отметьте соответствующим образом. – unwind
Предположительно это Java, поскольку он сказал 'writeSerialData',' ObjectOutputStream', 'getBytes' и' writeObjectOverride'. Я помечаю это сейчас. –
К сожалению, извинения. Да, Java. – cwall