diff --git a/protocol/src/main/java/com/zfoo/protocol/registration/ProtocolRegistration.java b/protocol/src/main/java/com/zfoo/protocol/registration/ProtocolRegistration.java index 7540ea6f..36d326ea 100644 --- a/protocol/src/main/java/com/zfoo/protocol/registration/ProtocolRegistration.java +++ b/protocol/src/main/java/com/zfoo/protocol/registration/ProtocolRegistration.java @@ -135,17 +135,19 @@ public class ProtocolRegistration implements IProtocolRegistration { var originFields = ProtocolAnalysis.getFields(packetClazz); var constructorParams = new Object[originFields.size()]; for (int i = 0, j = fields.length; i < j; i++) { - Field field = fields[i]; + var field = fields[i]; + var index = originFields.indexOf(field); + var packetFieldRegistration = fieldRegistrations[i]; + // 协议向后兼容 if (field.isAnnotationPresent(Compatible.class)) { if (length == -1 || byteBuf.readerIndex() - readIndex >= length) { - break; + constructorParams[index] = packetFieldRegistration.defaultValue(); + continue; } } - IFieldRegistration packetFieldRegistration = fieldRegistrations[i]; ISerializer serializer = packetFieldRegistration.serializer(); Object fieldValue = serializer.readObject(byteBuf, packetFieldRegistration); - var index = originFields.indexOf(field); constructorParams[index] = fieldValue; } object = ReflectionUtils.newInstance(constructor, constructorParams); diff --git a/protocol/src/main/java/com/zfoo/protocol/registration/field/IFieldRegistration.java b/protocol/src/main/java/com/zfoo/protocol/registration/field/IFieldRegistration.java index 32f44d26..caca3032 100644 --- a/protocol/src/main/java/com/zfoo/protocol/registration/field/IFieldRegistration.java +++ b/protocol/src/main/java/com/zfoo/protocol/registration/field/IFieldRegistration.java @@ -22,6 +22,10 @@ import com.zfoo.protocol.serializer.reflect.ISerializer; */ public interface IFieldRegistration { + default Object defaultValue() { + return serializer().defaultValue(this); + } + ISerializer serializer(); } diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/ArraySerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/ArraySerializer.java index 75e24843..ef719e52 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/ArraySerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/ArraySerializer.java @@ -68,4 +68,10 @@ public class ArraySerializer implements ISerializer { return array; } + @Override + public Object defaultValue(IFieldRegistration fieldRegistration) { + ArrayField arrayField = (ArrayField) fieldRegistration; + return Array.newInstance(arrayField.getType(), 0); + } + } diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/BooleanSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/BooleanSerializer.java index 2a5a7e36..51a517b2 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/BooleanSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/BooleanSerializer.java @@ -33,4 +33,9 @@ public class BooleanSerializer implements ISerializer { public Object readObject(ByteBuf buffer, IFieldRegistration fieldRegistration) { return ByteBufUtils.readBooleanBox(buffer); } + + @Override + public Object defaultValue(IFieldRegistration fieldRegistration) { + return Boolean.FALSE; + } } diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/ByteSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/ByteSerializer.java index 1fdb1d8f..cddc43df 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/ByteSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/ByteSerializer.java @@ -34,4 +34,9 @@ public class ByteSerializer implements ISerializer { return ByteBufUtils.readByteBox(buffer); } + @Override + public Object defaultValue(IFieldRegistration fieldRegistration) { + return Byte.valueOf((byte) 0); + } + } diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/CharSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/CharSerializer.java index 9da8629b..983e5934 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/CharSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/CharSerializer.java @@ -33,4 +33,9 @@ public class CharSerializer implements ISerializer { public Object readObject(ByteBuf buffer, IFieldRegistration fieldRegistration) { return ByteBufUtils.readCharBox(buffer); } + + @Override + public Object defaultValue(IFieldRegistration fieldRegistration) { + return Character.MIN_VALUE; + } } diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/DoubleSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/DoubleSerializer.java index 23484beb..f37f2234 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/DoubleSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/DoubleSerializer.java @@ -23,6 +23,7 @@ import io.netty.buffer.ByteBuf; public class DoubleSerializer implements ISerializer { public static final DoubleSerializer INSTANCE = new DoubleSerializer(); + public static final Double ZERO = Double.valueOf(0D); @Override public void writeObject(ByteBuf buffer, Object object, IFieldRegistration fieldRegistration) { @@ -33,4 +34,10 @@ public class DoubleSerializer implements ISerializer { public Object readObject(ByteBuf buffer, IFieldRegistration fieldRegistration) { return ByteBufUtils.readDoubleBox(buffer); } + + + @Override + public Object defaultValue(IFieldRegistration fieldRegistration) { + return ZERO; + } } diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/FloatSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/FloatSerializer.java index 56c54607..f4d7cabd 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/FloatSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/FloatSerializer.java @@ -23,7 +23,7 @@ import io.netty.buffer.ByteBuf; public class FloatSerializer implements ISerializer { public static final FloatSerializer INSTANCE = new FloatSerializer(); - + public static final Float ZERO = Float.valueOf(0F); @Override public void writeObject(ByteBuf buffer, Object object, IFieldRegistration fieldRegistration) { ByteBufUtils.writeFloatBox(buffer, (Float) object); @@ -33,4 +33,9 @@ public class FloatSerializer implements ISerializer { public Object readObject(ByteBuf buffer, IFieldRegistration fieldRegistration) { return ByteBufUtils.readFloatBox(buffer); } + + @Override + public Object defaultValue(IFieldRegistration fieldRegistration) { + return ZERO; + } } diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/ISerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/ISerializer.java index c79800c0..867d2273 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/ISerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/ISerializer.java @@ -32,4 +32,6 @@ public interface ISerializer { Object readObject(ByteBuf buffer, IFieldRegistration fieldRegistration); + Object defaultValue(IFieldRegistration fieldRegistration); + } diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/IntSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/IntSerializer.java index f32b951c..bd8cfc46 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/IntSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/IntSerializer.java @@ -33,4 +33,9 @@ public class IntSerializer implements ISerializer { public Object readObject(ByteBuf buffer, IFieldRegistration fieldRegistration) { return ByteBufUtils.readIntBox(buffer); } + + @Override + public Object defaultValue(IFieldRegistration fieldRegistration) { + return Integer.valueOf(0); + } } diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/ListSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/ListSerializer.java index 32c25f85..4f462d1d 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/ListSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/ListSerializer.java @@ -19,6 +19,7 @@ import com.zfoo.protocol.registration.field.IFieldRegistration; import com.zfoo.protocol.registration.field.ListField; import io.netty.buffer.ByteBuf; +import java.util.ArrayList; import java.util.List; /** @@ -62,4 +63,9 @@ public class ListSerializer implements ISerializer { return list; } + + @Override + public Object defaultValue(IFieldRegistration fieldRegistration) { + return new ArrayList<>(); + } } diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/LongSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/LongSerializer.java index 53d74e0e..80af2444 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/LongSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/LongSerializer.java @@ -33,4 +33,9 @@ public class LongSerializer implements ISerializer { public Object readObject(ByteBuf buffer, IFieldRegistration fieldRegistration) { return ByteBufUtils.readLongBox(buffer); } + + @Override + public Object defaultValue(IFieldRegistration fieldRegistration) { + return Long.valueOf(0); + } } diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/MapSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/MapSerializer.java index 050ead8e..7397fdb0 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/MapSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/MapSerializer.java @@ -19,6 +19,7 @@ import com.zfoo.protocol.registration.field.IFieldRegistration; import com.zfoo.protocol.registration.field.MapField; import io.netty.buffer.ByteBuf; +import java.util.HashMap; import java.util.Map; /** @@ -69,4 +70,9 @@ public class MapSerializer implements ISerializer { } return map; } + + @Override + public Object defaultValue(IFieldRegistration fieldRegistration) { + return new HashMap<>(); + } } diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/ObjectProtocolSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/ObjectProtocolSerializer.java index f1ddc040..b4ecad7f 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/ObjectProtocolSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/ObjectProtocolSerializer.java @@ -44,4 +44,9 @@ public class ObjectProtocolSerializer implements ISerializer { IProtocolRegistration protocol = ProtocolManager.getProtocol(objectProtocolField.getProtocolId()); return protocol.read(buffer); } + + @Override + public Object defaultValue(IFieldRegistration fieldRegistration) { + return null; + } } diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/SetSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/SetSerializer.java index dacaf438..b7ccfcaa 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/SetSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/SetSerializer.java @@ -19,6 +19,7 @@ import com.zfoo.protocol.registration.field.IFieldRegistration; import com.zfoo.protocol.registration.field.SetField; import io.netty.buffer.ByteBuf; +import java.util.HashSet; import java.util.Set; /** @@ -64,4 +65,9 @@ public class SetSerializer implements ISerializer { return set; } + @Override + public Object defaultValue(IFieldRegistration fieldRegistration) { + return new HashSet<>(); + } + } diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/ShortSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/ShortSerializer.java index 98daeedd..0f255610 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/ShortSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/ShortSerializer.java @@ -33,4 +33,9 @@ public class ShortSerializer implements ISerializer { public Object readObject(ByteBuf buffer, IFieldRegistration fieldRegistration) { return ByteBufUtils.readShortBox(buffer); } + + @Override + public Object defaultValue(IFieldRegistration fieldRegistration) { + return Short.valueOf((short) 0); + } } diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/StringSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/StringSerializer.java index 57aa0a7f..87f76b85 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/StringSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/reflect/StringSerializer.java @@ -15,6 +15,7 @@ package com.zfoo.protocol.serializer.reflect; import com.zfoo.protocol.buffer.ByteBufUtils; import com.zfoo.protocol.registration.field.IFieldRegistration; +import com.zfoo.protocol.util.StringUtils; import io.netty.buffer.ByteBuf; /** @@ -33,4 +34,9 @@ public class StringSerializer implements ISerializer { public Object readObject(ByteBuf buffer, IFieldRegistration fieldRegistration) { return ByteBufUtils.readString(buffer); } + + @Override + public Object defaultValue(IFieldRegistration fieldRegistration) { + return StringUtils.EMPTY; + } }