package rocks.inspectit.shared.all.serializer.impl;
import java.lang.reflect.Constructor;
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.Serializer;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
/**
* Special serialzier that eliminates the difficultes of de-serializing the
* {@link StackTraceElement}.
*
* @author Ivan Senic
*
*/
public class StackTraceElementSerializer extends Serializer<StackTraceElement> {
/**
* Constructor for new instances.
*/
private final Constructor<StackTraceElement> constructor;
/**
* Default constructor.
*/
public StackTraceElementSerializer() {
try {
constructor = StackTraceElement.class.getConstructor(String.class, String.class, String.class, int.class);
} catch (final Exception e) {
throw new RuntimeException(e);
}
}
/**
* {@inheritDoc}
*/
@Override
public StackTraceElement read(Kryo kryo, Input input, Class<StackTraceElement> type) {
String className = input.readString();
String methodName = input.readString();
String fileName = input.readString();
int lineNumber = input.readInt(true);
try {
return constructor.newInstance(className, methodName, fileName, lineNumber);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* {@inheritDoc}
*/
@Override
public void write(Kryo kryo, Output output, StackTraceElement stackTrace) {
output.writeString(stackTrace.getClassName());
output.writeString(stackTrace.getMethodName());
output.writeString(stackTrace.getFileName());
output.writeInt(stackTrace.getLineNumber(), true);
}
}