package com.cwa.gameblob;
import com.cwa.gamecore.GameException;
import com.cwa.gamecore.io.ByteArrayGameInput;
import com.cwa.gamecore.io.ByteArrayGameOutput;
import com.cwa.gamecore.io.GameInput;
import com.cwa.gamecore.io.GameOutput;
import java.util.ArrayList;
import java.util.List;
/**
* 大字段编码解码器。
* @param <T>
*/
public abstract class BlobCodec<T> {
/**
* 解码游戏对象。
* @param in
* @return
*/
public abstract T read(GameInput in);
/**
* 编码游戏对象。
* @param object
* @param out
*/
public abstract void write(T object, GameOutput out);
/**
* 解码List。
* @param in
* @return
*/
public final List<T> readList(GameInput in) {
int size = in.getShort();
List<T> list = new ArrayList<T>(size);
for (int i = 0; i < size; i++) {
list.add(read(in));
}
return list;
}
/**
* 编码List。
* @param list
* @param out
*/
public final void writeList(List<T> list, GameOutput out) {
out.putShort((short) list.size());
for (T t : list) {
write(t, out);
}
}
/**
* 将对象编码为BLOB。
* @param obj
* @return
*/
public final byte[] encode(T obj) {
ByteArrayGameOutput out = new ByteArrayGameOutput();
write(obj, out);
return out.toByteArray();
}
/**
* 将字节数组解码为对象。
* @param blob
* @return
*/
public final T decode(byte[] blob) {
ByteArrayGameInput in = new ByteArrayGameInput(blob);
T obj = read(in);
if (in.remaining() > 0) {
throw new GameException("Decode failed, remaining bytes: " + in.remaining());
}
return obj;
}
}