final ObjectAndPersistInfo objectAndItsPersistInfo)
throws ObjectIOException, ObjectIOInvalidClassException,
ObjectIONotSerializableException, ObjectIOClassNotFoundException,
ObjectIODataRecordNotFoundException, ObjectIODataCorruptedException {
// will write original object else will write the substitute
ObjectAndPersistInfo toWriteObjectAndPersistInfo =
/**/objectAndItsPersistInfo.getSubstituteObjectAndPersistInfo();
if (toWriteObjectAndPersistInfo == null) {
toWriteObjectAndPersistInfo = objectAndItsPersistInfo;
}
assert !toWriteObjectAndPersistInfo.isSubstituted();
// ASSERTX
assert assertWritable(toWriteObjectAndPersistInfo);
final DataRecordIdentifier dataRecordIdentifier = toWriteObjectAndPersistInfo.dataRecordIdentifier;
if (logger.debugEnabled) {
logger.debug("begin write: data record " + dataRecordIdentifier);
}
/* the object class can be different than object.getClass() */
final ClassInfo classInfo = toWriteObjectAndPersistInfo.objectClassInfo;
// ASSERTX
assert classInfo != null && classInfo != ClassInfo.NULL : "class information for object not defined";
final IObjectOutput objectOutput;
objectOutput = getObjectOutput(classInfo);
final int byteSize = objectOutput.byteSize(toWriteObjectAndPersistInfo,
HEADER_DATA_SIZE);
final byte[] binary = new byte[byteSize];
final int offset = headerWriter.write(classInfo, binary);
if (offset != HEADER_DATA_SIZE) {
throw new ObjectIOException("header data size missmatch");
}
final ObjectClassInfoAndDeclared[] sonObject = objectOutput.writeBody(
binary, offset, toWriteObjectAndPersistInfo, true);
writeDataRecord(dataRecordIdentifier, binary);
if (logger.debugEnabled) {
logger.debug("end write: data record " + dataRecordIdentifier);
}
toWriteObjectAndPersistInfo.setNewObject(false);
return sonObject;
}