前言
前后端统一用MessagePack,结果序列化的结果不一样,发现C#侧需要给每个类增加描述字段数量的Head,而Java却不用,所以在Java侧封装一下序列化和反序列化方法,这样两边解析的内容就完全一致了。
项目
代码编写
感觉还有很大的优化空间
import org.msgpack.core.MessageBufferPacker;
import org.msgpack.core.MessagePack;
import org.msgpack.core.MessageUnpacker;
import java.io.IOException;
import java.lang.reflect.*;
import java.util.*;
public class MessagePackSerializer {
public static byte[] serialize(Object obj) throws IOException, IllegalAccessException {
try (MessageBufferPacker packer = MessagePack.newDefaultBufferPacker()) {
serializeObject(obj, packer);
return packer.toByteArray();
}
}
public static <T> T deserialize(byte[] data, Class<T> clazz) throws IOException, IllegalAccessException,
InstantiationException, InvocationTargetException, NoSuchMethodException, ClassNotFoundException {
try (MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(data)) {
return clazz.cast(deserializeObject(clazz, unpacker));
}
}
private static void serializeObject(Object obj, MessageBufferPacker packer)
throws IOException, IllegalAccessException {
if (obj == null) {
packer.packNil();
return;
}
Class<?> clazz = obj.getClass();
List<Field> allFields = new ArrayList<>();
while (clazz != null) {
Field[] fields = clazz.getDeclaredFields();
allFields.addAll(Arrays.asList(fields));
clazz = clazz.getSuperclass(); // 处理父类字段
}
packer.packArrayHeader(allFields.size());
for (Field field : allFields) {
field.setAccessible(true);
Object value = field.get(obj);
serializeValue(value, packer);
}
}
private static Object deserializeObject(Class<?> clazz, MessageUnpacker unpacker) throws IOException,
IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException,
ClassNotFoundException {
if (unpacker.tryUnpackNil()) {