
com.alibaba.rsocket.encoding.impl.ObjectEncodingHandlerSerializationImpl Maven / Gradle / Ivy
package com.alibaba.rsocket.encoding.impl;
import com.alibaba.rsocket.encoding.EncodingException;
import com.alibaba.rsocket.encoding.ObjectEncodingHandler;
import com.alibaba.rsocket.metadata.RSocketMimeType;
import com.alibaba.rsocket.observability.RsocketErrorCode;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufInputStream;
import io.netty.buffer.ByteBufOutputStream;
import io.netty.buffer.PooledByteBufAllocator;
import io.netty.util.ReferenceCountUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
/**
* Java Object Serialization encoding
*
* @author leijuan
*/
public class ObjectEncodingHandlerSerializationImpl implements ObjectEncodingHandler {
@NotNull
@Override
public RSocketMimeType mimeType() {
return RSocketMimeType.Java_Object;
}
@Override
public ByteBuf encodingParams(@Nullable Object[] args) throws EncodingException {
if (isArrayEmpty(args)) {
return EMPTY_BUFFER;
}
return objectToByteBuf(args);
}
@Override
public Object decodeParams(ByteBuf data, @Nullable Class>... targetClasses) throws EncodingException {
if (data.readableBytes() > 0 && !isArrayEmpty(targetClasses)) {
return byteBufToObject(data);
}
return null;
}
@Override
@NotNull
public ByteBuf encodingResult(@Nullable Object result) throws EncodingException {
if (result != null) {
return objectToByteBuf(result);
}
return EMPTY_BUFFER;
}
@Override
@Nullable
public Object decodeResult(ByteBuf data, @Nullable Class> targetClass) throws EncodingException {
if (data.readableBytes() > 0 && targetClass != null) {
return byteBufToObject(data);
}
return null;
}
private ByteBuf objectToByteBuf(Object obj) throws EncodingException {
ByteBuf byteBuf = PooledByteBufAllocator.DEFAULT.buffer();
try {
ByteBufOutputStream bos = new ByteBufOutputStream(byteBuf);
ObjectOutputStream outputStream = new ObjectOutputStream(bos);
outputStream.writeObject(obj);
outputStream.close();
return byteBuf;
} catch (Exception e) {
ReferenceCountUtil.safeRelease(byteBuf);
throw new EncodingException(RsocketErrorCode.message("RST-700500", obj.getClass().getName(), "byte[]"), e);
}
}
private Object byteBufToObject(ByteBuf data) throws EncodingException {
try {
ObjectInputStream inputStream = new ObjectInputStream(new ByteBufInputStream(data));
Object object = inputStream.readObject();
inputStream.close();
return object;
} catch (Exception e) {
throw new EncodingException(RsocketErrorCode.message("RST-700501", "byte[]", "Object"), e);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy