package com.alibaba.doris.dataserver.store.serialize; import java.nio.ByteBuffer; import com.alibaba.doris.common.data.ByteWrapper; import com.alibaba.doris.common.data.Key; import com.alibaba.doris.common.data.KeyFactory; /** * @author ajun Email:jack.yuj@alibaba-inc.com */ public class KeySerializer extends BaseSerializer<Key> { public Key decode(byte[] bytes) { return decode(ByteBuffer.wrap(bytes)); } public Key decode(ByteBuffer buffer) { if (buffer.remaining() > (INTEGER_INT * 2)) { int startPos = buffer.position(); int vnode = buffer.getInt();// read vnode int keyLen = buffer.getInt();// read len if (buffer.remaining() >= keyLen) { byte[] keyBytes = new byte[keyLen]; buffer.get(keyBytes);// read data return KeyFactory.createKey(keyBytes, vnode); } buffer.position(startPos); } return null; } public boolean encode(ByteBuffer buffer, Key key) { int remaining = buffer.remaining(); if (remaining > 9) { int pos = buffer.position(); buffer.put(getVersion()); buffer.putInt(key.getVNode()); byte[] keyBytes = key.getPhysicalKeyBytes(); buffer.putInt(keyBytes.length); if (buffer.remaining() >= keyBytes.length) { buffer.put(keyBytes); return true; } buffer.position(pos); } return false; } public ByteWrapper encode(Key t) { byte[] keyBytes = t.getPhysicalKeyBytes(); int len = INTEGER_INT * 2 + keyBytes.length + 1; ByteBuffer buf = getByteBuffer(len); encode(buf, t); return new ByteWrapper(buf.array(), 0, buf.position()); } public byte getVersion() { return 0; } private static final int INTEGER_INT = 4; }