From 786a0f051e0c2e8ffa4fac958f7a8403db8409e3 Mon Sep 17 00:00:00 2001 From: jaysunxiao Date: Fri, 15 Oct 2021 17:12:04 +0800 Subject: [PATCH] =?UTF-8?q?ref[protocol]:=20=E9=87=8D=E6=9E=84protocol?= =?UTF-8?q?=EF=BC=8C=E5=B0=86=E7=B2=BE=E7=AE=80=E4=BB=A3=E7=A0=81=E7=9A=84?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E6=8F=90=E5=8F=96=E5=88=B0ICutDownSerializer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../protocol/serializer/CodeLanguage.java | 5 + .../serializer/CutDownArraySerializer.java | 307 ++++++++++++++++++ .../serializer/CutDownListSerializer.java | 120 +++++++ .../serializer/CutDownMapSerializer.java | 159 +++++++++ .../serializer/CutDownSetSerializer.java | 123 +++++++ .../serializer/ICutDownSerializer.java | 31 ++ .../enhance/EnhanceArraySerializer.java | 135 +------- .../enhance/EnhanceListSerializer.java | 50 +-- .../enhance/EnhanceMapSerializer.java | 110 +------ .../enhance/EnhanceSetSerializer.java | 49 +-- 10 files changed, 789 insertions(+), 300 deletions(-) create mode 100644 protocol/src/main/java/com/zfoo/protocol/serializer/CutDownArraySerializer.java create mode 100644 protocol/src/main/java/com/zfoo/protocol/serializer/CutDownListSerializer.java create mode 100644 protocol/src/main/java/com/zfoo/protocol/serializer/CutDownMapSerializer.java create mode 100644 protocol/src/main/java/com/zfoo/protocol/serializer/CutDownSetSerializer.java create mode 100644 protocol/src/main/java/com/zfoo/protocol/serializer/ICutDownSerializer.java diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/CodeLanguage.java b/protocol/src/main/java/com/zfoo/protocol/serializer/CodeLanguage.java index 7e7efce4..6b8f42fc 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/CodeLanguage.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/CodeLanguage.java @@ -18,6 +18,11 @@ package com.zfoo.protocol.serializer; */ public enum CodeLanguage { + /** + * Javassist字节码增强 + */ + Enhance, + JavaScript, Lua, diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/CutDownArraySerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/CutDownArraySerializer.java new file mode 100644 index 00000000..5ebf84d1 --- /dev/null +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/CutDownArraySerializer.java @@ -0,0 +1,307 @@ +/* + * Copyright (C) 2020 The zfoo Authors + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and limitations under the License. + */ + +package com.zfoo.protocol.serializer; + +import com.zfoo.protocol.generate.GenerateProtocolFile; +import com.zfoo.protocol.registration.EnhanceUtils; +import com.zfoo.protocol.registration.field.ArrayField; +import com.zfoo.protocol.registration.field.IFieldRegistration; +import com.zfoo.protocol.util.StringUtils; + +import java.lang.reflect.Field; + +/** + * @author jaysunxiao + * @version 3.0 + */ +public class CutDownArraySerializer implements ICutDownSerializer { + + private static final CutDownArraySerializer INSTANCE = new CutDownArraySerializer(); + + public static CutDownArraySerializer getInstance() { + return INSTANCE; + } + + + @Override + public boolean writeObject(StringBuilder builder, String objectStr, Field field, IFieldRegistration fieldRegistration, CodeLanguage language) { + var arrayField = (ArrayField) fieldRegistration; + var arrayName = getArrayClassName(arrayField); + + // 直接在字节码里调用方法是为了减小生成字节码的体积,下面的代码去掉也不会有任何影响 + switch (arrayName) { + case "boolean": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}.writeBooleanArray($1, {});", EnhanceUtils.byteBufUtils, objectStr)); + return true; + } + break; + case "Boolean": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}.writeBooleanBoxArray($1, {});", EnhanceUtils.byteBufUtils, objectStr)); + return true; + } + break; + case "byte": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}.writeByteArray($1, {});", EnhanceUtils.byteBufUtils, objectStr)); + return true; + } + break; + case "Byte": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}.writeByteBoxArray($1, {});", EnhanceUtils.byteBufUtils, objectStr)); + return true; + } + break; + case "short": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}.writeShortArray($1, {});", EnhanceUtils.byteBufUtils, objectStr)); + return true; + } + break; + case "Short": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}.writeShortBoxArray($1, {});", EnhanceUtils.byteBufUtils, objectStr)); + return true; + } + break; + case "int": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}.writeIntArray($1, {});", EnhanceUtils.byteBufUtils, objectStr)); + return true; + } + break; + case "Integer": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}.writeIntBoxArray($1, {});", EnhanceUtils.byteBufUtils, objectStr)); + return true; + } + break; + case "long": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}.writeLongArray($1, {});", EnhanceUtils.byteBufUtils, objectStr)); + return true; + } + break; + case "Long": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}.writeLongBoxArray($1, {});", EnhanceUtils.byteBufUtils, objectStr)); + return true; + } + break; + case "float": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}.writeFloatArray($1, {});", EnhanceUtils.byteBufUtils, objectStr)); + return true; + } + break; + case "Float": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}.writeFloatBoxArray($1, {});", EnhanceUtils.byteBufUtils, objectStr)); + return true; + } + break; + case "double": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}.writeDoubleArray($1, {});", EnhanceUtils.byteBufUtils, objectStr)); + return true; + } + break; + case "Double": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}.writeDoubleBoxArray($1, {});", EnhanceUtils.byteBufUtils, objectStr)); + return true; + } + break; + case "String": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}.writeStringArray($1, {});", EnhanceUtils.byteBufUtils, objectStr)); + return true; + } + break; + case "char": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}.writeCharArray($1, {});", EnhanceUtils.byteBufUtils, objectStr)); + return true; + } + break; + case "Character": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}.writeCharBoxArray($1, {});", EnhanceUtils.byteBufUtils, objectStr)); + return true; + } + break; + default: + } + + return false; + } + + @Override + public String readObject(StringBuilder builder, Field field, IFieldRegistration fieldRegistration, CodeLanguage language) { + var arrayField = (ArrayField) fieldRegistration; + var arrayName = getArrayClassName(arrayField); + + var array = "array" + GenerateProtocolFile.index.getAndIncrement(); + + switch (arrayName) { + case "boolean": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}[] {} = {}.readBooleanArray($1);", arrayName, array, EnhanceUtils.byteBufUtils)); + return array; + } + break; + case "Boolean": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}[] {} = {}.readBooleanBoxArray($1);", arrayName, array, EnhanceUtils.byteBufUtils)); + return array; + } + break; + case "byte": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}[] {} = {}.readByteArray($1);", arrayName, array, EnhanceUtils.byteBufUtils)); + return array; + } + break; + case "Byte": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}[] {} = {}.readByteBoxArray($1);", arrayName, array, EnhanceUtils.byteBufUtils)); + return array; + } + break; + case "short": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}[] {} = {}.readShortArray($1);", arrayName, array, EnhanceUtils.byteBufUtils)); + return array; + } + break; + case "Short": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}[] {} = {}.readShortBoxArray($1);", arrayName, array, EnhanceUtils.byteBufUtils)); + return array; + } + break; + case "int": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}[] {} = {}.readIntArray($1);", arrayName, array, EnhanceUtils.byteBufUtils)); + return array; + } + break; + case "Integer": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}[] {} = {}.readIntBoxArray($1);", arrayName, array, EnhanceUtils.byteBufUtils)); + return array; + } + break; + case "long": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}[] {} = {}.readLongArray($1);", arrayName, array, EnhanceUtils.byteBufUtils)); + return array; + } + break; + case "Long": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}[] {} = {}.readLongBoxArray($1);", arrayName, array, EnhanceUtils.byteBufUtils)); + return array; + } + break; + case "float": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}[] {} = {}.readFloatArray($1);", arrayName, array, EnhanceUtils.byteBufUtils)); + return array; + } + break; + case "Float": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}[] {} = {}.readFloatBoxArray($1);", arrayName, array, EnhanceUtils.byteBufUtils)); + return array; + } + break; + case "double": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}[] {} = {}.readDoubleArray($1);", arrayName, array, EnhanceUtils.byteBufUtils)); + return array; + } + break; + case "Double": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}[] {} = {}.readDoubleBoxArray($1);", arrayName, array, EnhanceUtils.byteBufUtils)); + return array; + } + break; + case "String": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}[] {} = {}.readStringArray($1);", arrayName, array, EnhanceUtils.byteBufUtils)); + return array; + } + break; + case "char": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}[] {} = {}.readCharArray($1);", arrayName, array, EnhanceUtils.byteBufUtils)); + return array; + } + break; + case "Character": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}[] {} = {}.readCharBoxArray($1);", arrayName, array, EnhanceUtils.byteBufUtils)); + return array; + } + break; + default: + } + + GenerateProtocolFile.index.getAndDecrement(); + return null; + } + + public String getArrayClassName(ArrayField arrayField) { + // 去掉包装类型的前缀java.lang + return arrayField.getField().getType().getComponentType().getCanonicalName().replaceFirst("java.lang.", StringUtils.EMPTY); + } + +} diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/CutDownListSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/CutDownListSerializer.java new file mode 100644 index 00000000..df498b55 --- /dev/null +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/CutDownListSerializer.java @@ -0,0 +1,120 @@ +/* + * Copyright (C) 2020 The zfoo Authors + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and limitations under the License. + */ + +package com.zfoo.protocol.serializer; + +import com.zfoo.protocol.generate.GenerateProtocolFile; +import com.zfoo.protocol.registration.EnhanceUtils; +import com.zfoo.protocol.registration.field.IFieldRegistration; +import com.zfoo.protocol.registration.field.ListField; +import com.zfoo.protocol.registration.field.ObjectProtocolField; +import com.zfoo.protocol.util.StringUtils; + +import java.lang.reflect.Field; + +/** + * @author jaysunxiao + * @version 3.0 + */ +public class CutDownListSerializer implements ICutDownSerializer { + + private static final CutDownListSerializer INSTANCE = new CutDownListSerializer(); + + public static CutDownListSerializer getInstance() { + return INSTANCE; + } + + @Override + public boolean writeObject(StringBuilder builder, String objectStr, Field field, IFieldRegistration fieldRegistration, CodeLanguage language) { + var listField = (ListField) fieldRegistration; + + switch (listField.getType().getTypeName()) { + case "java.util.List": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}.writeIntList($1, (List){});", EnhanceUtils.byteBufUtils, objectStr)); + return true; + } + break; + case "java.util.List": { + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}.writeLongList($1, (List){});", EnhanceUtils.byteBufUtils, objectStr)); + return true; + } + break; + } + case "java.util.List": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}.writeStringList($1, (List){});", EnhanceUtils.byteBufUtils, objectStr)); + return true; + } + break; + default: + } + + // List + if (listField.getListElementRegistration() instanceof ObjectProtocolField) { + var objectProtocolField = (ObjectProtocolField) listField.getListElementRegistration(); + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}.writePacketList($1, (List){}, {});", EnhanceUtils.byteBufUtils, objectStr, EnhanceUtils.getProtocolRegistrationFieldNameByProtocolId(objectProtocolField.getProtocolId()))); + return true; + } + } + return false; + } + + @Override + public String readObject(StringBuilder builder, Field field, IFieldRegistration fieldRegistration, CodeLanguage language) { + var listField = (ListField) fieldRegistration; + var list = "list" + GenerateProtocolFile.index.getAndIncrement(); + + switch (listField.getType().getTypeName()) { + case "java.util.List": + switch (language) { + case Enhance: + builder.append(StringUtils.format("List {} = {}.readIntList($1);", list, EnhanceUtils.byteBufUtils)); + return list; + } + break; + case "java.util.List": + switch (language) { + case Enhance: + builder.append(StringUtils.format("List {} = {}.readLongList($1);", list, EnhanceUtils.byteBufUtils)); + return list; + } + break; + case "java.util.List": + switch (language) { + case Enhance: + builder.append(StringUtils.format("List {} = {}.readStringList($1);", list, EnhanceUtils.byteBufUtils)); + return list; + } + break; + default: + } + + if (listField.getListElementRegistration() instanceof ObjectProtocolField) { + var objectProtocolField = (ObjectProtocolField) listField.getListElementRegistration(); + switch (language) { + case Enhance: + builder.append(StringUtils.format("List {} = {}.readPacketList($1, {});", list, EnhanceUtils.byteBufUtils, EnhanceUtils.getProtocolRegistrationFieldNameByProtocolId(objectProtocolField.getProtocolId()))); + return list; + } + } + + GenerateProtocolFile.index.getAndDecrement(); + return null; + } +} diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/CutDownMapSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/CutDownMapSerializer.java new file mode 100644 index 00000000..aa6c7b6a --- /dev/null +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/CutDownMapSerializer.java @@ -0,0 +1,159 @@ +/* + * Copyright (C) 2020 The zfoo Authors + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and limitations under the License. + */ + +package com.zfoo.protocol.serializer; + +import com.zfoo.protocol.generate.GenerateProtocolFile; +import com.zfoo.protocol.registration.EnhanceUtils; +import com.zfoo.protocol.registration.field.BaseField; +import com.zfoo.protocol.registration.field.IFieldRegistration; +import com.zfoo.protocol.registration.field.MapField; +import com.zfoo.protocol.registration.field.ObjectProtocolField; +import com.zfoo.protocol.serializer.reflect.IntSerializer; +import com.zfoo.protocol.serializer.reflect.LongSerializer; +import com.zfoo.protocol.serializer.reflect.ObjectProtocolSerializer; +import com.zfoo.protocol.serializer.reflect.StringSerializer; +import com.zfoo.protocol.util.StringUtils; + +import java.lang.reflect.Field; + +/** + * @author jaysunxiao + * @version 3.0 + */ +public class CutDownMapSerializer implements ICutDownSerializer { + + private static final CutDownMapSerializer INSTANCE = new CutDownMapSerializer(); + + public static CutDownMapSerializer getInstance() { + return INSTANCE; + } + + @Override + public boolean writeObject(StringBuilder builder, String objectStr, Field field, IFieldRegistration fieldRegistration, CodeLanguage language) { + var mapField = (MapField) fieldRegistration; + var keyRegistration = mapField.getMapKeyRegistration(); + var valueRegistration = mapField.getMapValueRegistration(); + var keySerializer = keyRegistration.serializer(); + var valueSerializer = valueRegistration.serializer(); + + // 直接在字节码里调用方法是为了减小生成字节码的体积,下面的代码去掉也不会有任何影响 + if (keyRegistration instanceof BaseField) { + if (keySerializer == IntSerializer.INSTANCE) { + if (valueSerializer == IntSerializer.INSTANCE) { + builder.append(StringUtils.format("{}.writeIntIntMap($1, (Map){});", EnhanceUtils.byteBufUtils, objectStr)); + return true; + } else if (valueSerializer == LongSerializer.INSTANCE) { + builder.append(StringUtils.format("{}.writeIntLongMap($1, (Map){});", EnhanceUtils.byteBufUtils, objectStr)); + return true; + } else if (valueSerializer == StringSerializer.INSTANCE) { + builder.append(StringUtils.format("{}.writeIntStringMap($1, (Map){});", EnhanceUtils.byteBufUtils, objectStr)); + return true; + } else if (valueSerializer == ObjectProtocolSerializer.INSTANCE) { + builder.append(StringUtils.format("{}.writeIntPacketMap($1, (Map){}, {});", EnhanceUtils.byteBufUtils, objectStr, EnhanceUtils.getProtocolRegistrationFieldNameByProtocolId(((ObjectProtocolField) valueRegistration).getProtocolId()))); + return true; + } + } else if (keySerializer == LongSerializer.INSTANCE) { + if (valueSerializer == IntSerializer.INSTANCE) { + builder.append(StringUtils.format("{}.writeLongIntMap($1, (Map){});", EnhanceUtils.byteBufUtils, objectStr)); + return true; + } else if (valueSerializer == LongSerializer.INSTANCE) { + builder.append(StringUtils.format("{}.writeLongLongMap($1, (Map){});", EnhanceUtils.byteBufUtils, objectStr)); + return true; + } else if (valueSerializer == StringSerializer.INSTANCE) { + builder.append(StringUtils.format("{}.writeLongStringMap($1, (Map){});", EnhanceUtils.byteBufUtils, objectStr)); + return true; + } else if (valueSerializer == ObjectProtocolSerializer.INSTANCE) { + builder.append(StringUtils.format("{}.writeLongPacketMap($1, (Map){}, {});", EnhanceUtils.byteBufUtils, objectStr, EnhanceUtils.getProtocolRegistrationFieldNameByProtocolId(((ObjectProtocolField) valueRegistration).getProtocolId()))); + return true; + } + + } else if (keySerializer == StringSerializer.INSTANCE) { + if (valueSerializer == IntSerializer.INSTANCE) { + builder.append(StringUtils.format("{}.writeStringIntMap($1, (Map){});", EnhanceUtils.byteBufUtils, objectStr)); + return true; + } else if (valueSerializer == LongSerializer.INSTANCE) { + builder.append(StringUtils.format("{}.writeStringLongMap($1, (Map){});", EnhanceUtils.byteBufUtils, objectStr)); + return true; + } else if (valueSerializer == StringSerializer.INSTANCE) { + builder.append(StringUtils.format("{}.writeStringStringMap($1, (Map){});", EnhanceUtils.byteBufUtils, objectStr)); + return true; + } else if (valueSerializer == ObjectProtocolSerializer.INSTANCE) { + builder.append(StringUtils.format("{}.writeStringPacketMap($1, (Map){}, {});", EnhanceUtils.byteBufUtils, objectStr, EnhanceUtils.getProtocolRegistrationFieldNameByProtocolId(((ObjectProtocolField) valueRegistration).getProtocolId()))); + return true; + } + } + } + + return false; + } + + @Override + public String readObject(StringBuilder builder, Field field, IFieldRegistration fieldRegistration, CodeLanguage language) { + var mapField = (MapField) fieldRegistration; + var keyRegistration = mapField.getMapKeyRegistration(); + var valueRegistration = mapField.getMapValueRegistration(); + var keySerializer = keyRegistration.serializer(); + var valueSerializer = valueRegistration.serializer(); + + var map = "map" + GenerateProtocolFile.index.getAndIncrement(); + + if (keyRegistration instanceof BaseField) { + if (keySerializer == IntSerializer.INSTANCE) { + if (valueSerializer == IntSerializer.INSTANCE) { + builder.append(StringUtils.format("Map {} = {}.readIntIntMap($1);", map, EnhanceUtils.byteBufUtils)); + return map; + } else if (valueSerializer == LongSerializer.INSTANCE) { + builder.append(StringUtils.format("Map {} = {}.readIntLongMap($1);", map, EnhanceUtils.byteBufUtils)); + return map; + } else if (valueSerializer == StringSerializer.INSTANCE) { + builder.append(StringUtils.format("Map {} = {}.readIntStringMap($1);", map, EnhanceUtils.byteBufUtils)); + return map; + } else if (valueSerializer == ObjectProtocolSerializer.INSTANCE) { + builder.append(StringUtils.format("Map {} = {}.readIntPacketMap($1, {});", map, EnhanceUtils.byteBufUtils, EnhanceUtils.getProtocolRegistrationFieldNameByProtocolId(((ObjectProtocolField) valueRegistration).getProtocolId()))); + return map; + } + } else if (keySerializer == LongSerializer.INSTANCE) { + if (valueSerializer == IntSerializer.INSTANCE) { + builder.append(StringUtils.format("Map {} = {}.readLongIntMap($1);", map, EnhanceUtils.byteBufUtils)); + return map; + } else if (valueSerializer == LongSerializer.INSTANCE) { + builder.append(StringUtils.format("Map {} = {}.readLongLongMap($1);", map, EnhanceUtils.byteBufUtils)); + return map; + } else if (valueSerializer == StringSerializer.INSTANCE) { + builder.append(StringUtils.format("Map {} = {}.readLongStringMap($1);", map, EnhanceUtils.byteBufUtils)); + return map; + } else if (valueSerializer == ObjectProtocolSerializer.INSTANCE) { + builder.append(StringUtils.format("Map {} = {}.readLongPacketMap($1, {});", map, EnhanceUtils.byteBufUtils, EnhanceUtils.getProtocolRegistrationFieldNameByProtocolId(((ObjectProtocolField) valueRegistration).getProtocolId()))); + return map; + } + } else if (keySerializer == StringSerializer.INSTANCE) { + if (valueSerializer == IntSerializer.INSTANCE) { + builder.append(StringUtils.format("Map {} = {}.readStringIntMap($1);", map, EnhanceUtils.byteBufUtils)); + return map; + } else if (valueSerializer == LongSerializer.INSTANCE) { + builder.append(StringUtils.format("Map {} = {}.readStringLongMap($1);", map, EnhanceUtils.byteBufUtils)); + return map; + } else if (valueSerializer == StringSerializer.INSTANCE) { + builder.append(StringUtils.format("Map {} = {}.readStringStringMap($1);", map, EnhanceUtils.byteBufUtils)); + return map; + } else if (valueSerializer == ObjectProtocolSerializer.INSTANCE) { + builder.append(StringUtils.format("Map {} = {}.readStringPacketMap($1, {});", map, EnhanceUtils.byteBufUtils, EnhanceUtils.getProtocolRegistrationFieldNameByProtocolId(((ObjectProtocolField) valueRegistration).getProtocolId()))); + return map; + } + } + } + + GenerateProtocolFile.index.getAndDecrement(); + return null; + } +} diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/CutDownSetSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/CutDownSetSerializer.java new file mode 100644 index 00000000..97ce3e5e --- /dev/null +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/CutDownSetSerializer.java @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2020 The zfoo Authors + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and limitations under the License. + */ + +package com.zfoo.protocol.serializer; + +import com.zfoo.protocol.generate.GenerateProtocolFile; +import com.zfoo.protocol.registration.EnhanceUtils; +import com.zfoo.protocol.registration.field.IFieldRegistration; +import com.zfoo.protocol.registration.field.ObjectProtocolField; +import com.zfoo.protocol.registration.field.SetField; +import com.zfoo.protocol.util.StringUtils; + +import java.lang.reflect.Field; + +/** + * @author jaysunxiao + * @version 3.0 + */ +public class CutDownSetSerializer implements ICutDownSerializer { + + private static final CutDownSetSerializer INSTANCE = new CutDownSetSerializer(); + + public static CutDownSetSerializer getInstance() { + return INSTANCE; + } + + @Override + public boolean writeObject(StringBuilder builder, String objectStr, Field field, IFieldRegistration fieldRegistration, CodeLanguage language) { + + var setField = (SetField) fieldRegistration; + + // 直接在字节码里调用方法是为了减小生成字节码的体积,下面的代码去掉也不会有任何影响 + switch (setField.getType().getTypeName()) { + case "java.util.Set": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}.writeIntSet($1, (Set){});", EnhanceUtils.byteBufUtils, objectStr)); + return true; + } + break; + case "java.util.Set": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}.writeLongSet($1, (Set){});", EnhanceUtils.byteBufUtils, objectStr)); + return true; + } + break; + case "java.util.Set": + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}.writeStringSet($1, (Set){});", EnhanceUtils.byteBufUtils, objectStr)); + return true; + } + break; + default: + } + + // Set + if (setField.getSetElementRegistration() instanceof ObjectProtocolField) { + var objectProtocolField = (ObjectProtocolField) setField.getSetElementRegistration(); + switch (language) { + case Enhance: + builder.append(StringUtils.format("{}.writePacketSet($1, (Set){}, {});", EnhanceUtils.byteBufUtils, objectStr, EnhanceUtils.getProtocolRegistrationFieldNameByProtocolId(objectProtocolField.getProtocolId()))); + return true; + } + } + + return false; + } + + @Override + public String readObject(StringBuilder builder, Field field, IFieldRegistration fieldRegistration, CodeLanguage language) { + var setField = (SetField) fieldRegistration; + var set = "set" + GenerateProtocolFile.index.getAndIncrement(); + + switch (setField.getType().getTypeName()) { + case "java.util.Set": + switch (language) { + case Enhance: + builder.append(StringUtils.format("Set {} = {}.readIntSet($1);", set, EnhanceUtils.byteBufUtils)); + return set; + } + break; + case "java.util.Set": + switch (language) { + case Enhance: + builder.append(StringUtils.format("Set {} = {}.readLongSet($1);", set, EnhanceUtils.byteBufUtils)); + return set; + } + break; + case "java.util.Set": + switch (language) { + case Enhance: + builder.append(StringUtils.format("Set {} = {}.readStringSet($1);", set, EnhanceUtils.byteBufUtils)); + return set; + } + break; + default: + } + + if (setField.getSetElementRegistration() instanceof ObjectProtocolField) { + var objectProtocolField = (ObjectProtocolField) setField.getSetElementRegistration(); + switch (language) { + case Enhance: + builder.append(StringUtils.format("Set {} = {}.readPacketSet($1, {});", set, EnhanceUtils.byteBufUtils, EnhanceUtils.getProtocolRegistrationFieldNameByProtocolId(objectProtocolField.getProtocolId()))); + return set; + } + return set; + } + + GenerateProtocolFile.index.getAndDecrement(); + return null; + } +} diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/ICutDownSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/ICutDownSerializer.java new file mode 100644 index 00000000..e1f244e5 --- /dev/null +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/ICutDownSerializer.java @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2020 The zfoo Authors + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and limitations under the License. + */ + +package com.zfoo.protocol.serializer; + +import com.zfoo.protocol.registration.field.IFieldRegistration; + +import java.lang.reflect.Field; + +/** + * 减少生成的字节码和代码的体积,即使不调用这个方法,程序也依然能够正常运行 + * + * @author jaysunxiao + * @version 3.0 + */ +public interface ICutDownSerializer { + + boolean writeObject(StringBuilder builder, String objectStr, Field field, IFieldRegistration fieldRegistration, CodeLanguage language); + + String readObject(StringBuilder builder, Field field, IFieldRegistration fieldRegistration, CodeLanguage language); + +} diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/enhance/EnhanceArraySerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/enhance/EnhanceArraySerializer.java index c78236e4..a5ba9862 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/enhance/EnhanceArraySerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/enhance/EnhanceArraySerializer.java @@ -17,6 +17,8 @@ import com.zfoo.protocol.generate.GenerateProtocolFile; import com.zfoo.protocol.registration.EnhanceUtils; import com.zfoo.protocol.registration.field.ArrayField; import com.zfoo.protocol.registration.field.IFieldRegistration; +import com.zfoo.protocol.serializer.CodeLanguage; +import com.zfoo.protocol.serializer.CutDownArraySerializer; import com.zfoo.protocol.util.StringUtils; import java.lang.reflect.Field; @@ -29,65 +31,13 @@ public class EnhanceArraySerializer implements IEnhanceSerializer { @Override public void writeObject(StringBuilder builder, String objectStr, Field field, IFieldRegistration fieldRegistration) { - var arrayField = (ArrayField) fieldRegistration; - var arrayName = getArrayClassName(arrayField); - - // 直接在字节码里调用方法是为了减小生成字节码的体积,下面的代码去掉也不会有任何影响 - switch (arrayName) { - case "boolean": - builder.append(StringUtils.format("{}.writeBooleanArray($1, {});", EnhanceUtils.byteBufUtils, objectStr)); - return; - case "Boolean": - builder.append(StringUtils.format("{}.writeBooleanBoxArray($1, {});", EnhanceUtils.byteBufUtils, objectStr)); - return; - case "byte": - builder.append(StringUtils.format("{}.writeByteArray($1, {});", EnhanceUtils.byteBufUtils, objectStr)); - return; - case "Byte": - builder.append(StringUtils.format("{}.writeByteBoxArray($1, {});", EnhanceUtils.byteBufUtils, objectStr)); - return; - case "short": - builder.append(StringUtils.format("{}.writeShortArray($1, {});", EnhanceUtils.byteBufUtils, objectStr)); - return; - case "Short": - builder.append(StringUtils.format("{}.writeShortBoxArray($1, {});", EnhanceUtils.byteBufUtils, objectStr)); - return; - case "int": - builder.append(StringUtils.format("{}.writeIntArray($1, {});", EnhanceUtils.byteBufUtils, objectStr)); - return; - case "Integer": - builder.append(StringUtils.format("{}.writeIntBoxArray($1, {});", EnhanceUtils.byteBufUtils, objectStr)); - return; - case "long": - builder.append(StringUtils.format("{}.writeLongArray($1, {});", EnhanceUtils.byteBufUtils, objectStr)); - return; - case "Long": - builder.append(StringUtils.format("{}.writeLongBoxArray($1, {});", EnhanceUtils.byteBufUtils, objectStr)); - return; - case "float": - builder.append(StringUtils.format("{}.writeFloatArray($1, {});", EnhanceUtils.byteBufUtils, objectStr)); - return; - case "Float": - builder.append(StringUtils.format("{}.writeFloatBoxArray($1, {});", EnhanceUtils.byteBufUtils, objectStr)); - return; - case "double": - builder.append(StringUtils.format("{}.writeDoubleArray($1, {});", EnhanceUtils.byteBufUtils, objectStr)); - return; - case "Double": - builder.append(StringUtils.format("{}.writeDoubleBoxArray($1, {});", EnhanceUtils.byteBufUtils, objectStr)); - return; - case "String": - builder.append(StringUtils.format("{}.writeStringArray($1, {});", EnhanceUtils.byteBufUtils, objectStr)); - return; - case "char": - builder.append(StringUtils.format("{}.writeCharArray($1, {});", EnhanceUtils.byteBufUtils, objectStr)); - return; - case "Character": - builder.append(StringUtils.format("{}.writeCharBoxArray($1, {});", EnhanceUtils.byteBufUtils, objectStr)); - return; - default: + if (CutDownArraySerializer.getInstance().writeObject(builder, objectStr, field, fieldRegistration, CodeLanguage.Enhance)) { + return; } + var arrayField = (ArrayField) fieldRegistration; + var arrayName = CutDownArraySerializer.getInstance().getArrayClassName(arrayField); + var array = "array" + GenerateProtocolFile.index.getAndIncrement(); var length = "length" + GenerateProtocolFile.index.getAndIncrement(); builder.append(StringUtils.format("{}[] {} = {};", arrayName, array, objectStr)); @@ -108,66 +58,15 @@ public class EnhanceArraySerializer implements IEnhanceSerializer { @Override public String readObject(StringBuilder builder, Field field, IFieldRegistration fieldRegistration) { - var arrayField = (ArrayField) fieldRegistration; - var arrayName = getArrayClassName(arrayField); - - var array = "array" + GenerateProtocolFile.index.getAndIncrement(); - - switch (arrayName) { - case "boolean": - builder.append(StringUtils.format("{}[] {} = {}.readBooleanArray($1);", arrayName, array, EnhanceUtils.byteBufUtils)); - return array; - case "Boolean": - builder.append(StringUtils.format("{}[] {} = {}.readBooleanBoxArray($1);", arrayName, array, EnhanceUtils.byteBufUtils)); - return array; - case "byte": - builder.append(StringUtils.format("{}[] {} = {}.readByteArray($1);", arrayName, array, EnhanceUtils.byteBufUtils)); - return array; - case "Byte": - builder.append(StringUtils.format("{}[] {} = {}.readByteBoxArray($1);", arrayName, array, EnhanceUtils.byteBufUtils)); - return array; - case "short": - builder.append(StringUtils.format("{}[] {} = {}.readShortArray($1);", arrayName, array, EnhanceUtils.byteBufUtils)); - return array; - case "Short": - builder.append(StringUtils.format("{}[] {} = {}.readShortBoxArray($1);", arrayName, array, EnhanceUtils.byteBufUtils)); - return array; - case "int": - builder.append(StringUtils.format("{}[] {} = {}.readIntArray($1);", arrayName, array, EnhanceUtils.byteBufUtils)); - return array; - case "Integer": - builder.append(StringUtils.format("{}[] {} = {}.readIntBoxArray($1);", arrayName, array, EnhanceUtils.byteBufUtils)); - return array; - case "long": - builder.append(StringUtils.format("{}[] {} = {}.readLongArray($1);", arrayName, array, EnhanceUtils.byteBufUtils)); - return array; - case "Long": - builder.append(StringUtils.format("{}[] {} = {}.readLongBoxArray($1);", arrayName, array, EnhanceUtils.byteBufUtils)); - return array; - case "float": - builder.append(StringUtils.format("{}[] {} = {}.readFloatArray($1);", arrayName, array, EnhanceUtils.byteBufUtils)); - return array; - case "Float": - builder.append(StringUtils.format("{}[] {} = {}.readFloatBoxArray($1);", arrayName, array, EnhanceUtils.byteBufUtils)); - return array; - case "double": - builder.append(StringUtils.format("{}[] {} = {}.readDoubleArray($1);", arrayName, array, EnhanceUtils.byteBufUtils)); - return array; - case "Double": - builder.append(StringUtils.format("{}[] {} = {}.readDoubleBoxArray($1);", arrayName, array, EnhanceUtils.byteBufUtils)); - return array; - case "String": - builder.append(StringUtils.format("{}[] {} = {}.readStringArray($1);", arrayName, array, EnhanceUtils.byteBufUtils)); - return array; - case "char": - builder.append(StringUtils.format("{}[] {} = {}.readCharArray($1);", arrayName, array, EnhanceUtils.byteBufUtils)); - return array; - case "Character": - builder.append(StringUtils.format("{}[] {} = {}.readCharBoxArray($1);", arrayName, array, EnhanceUtils.byteBufUtils)); - return array; - default: + var cutDown = CutDownArraySerializer.getInstance().readObject(builder, field, fieldRegistration, CodeLanguage.Enhance); + if (cutDown != null) { + return cutDown; } + var arrayField = (ArrayField) fieldRegistration; + var arrayName = CutDownArraySerializer.getInstance().getArrayClassName(arrayField); + + var array = "array" + GenerateProtocolFile.index.getAndIncrement(); var length = "length" + GenerateProtocolFile.index.getAndIncrement(); builder.append(StringUtils.format("int {} = {}.readInt($1);", length, EnhanceUtils.byteBufUtils)); @@ -181,10 +80,4 @@ public class EnhanceArraySerializer implements IEnhanceSerializer { return array; } - - private String getArrayClassName(ArrayField arrayField) { - // 去掉包装类型的前缀java.lang - return arrayField.getField().getType().getComponentType().getCanonicalName().replaceFirst("java.lang.", StringUtils.EMPTY); - } - } diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/enhance/EnhanceListSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/enhance/EnhanceListSerializer.java index e030d684..ef71f423 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/enhance/EnhanceListSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/enhance/EnhanceListSerializer.java @@ -17,7 +17,8 @@ import com.zfoo.protocol.generate.GenerateProtocolFile; import com.zfoo.protocol.registration.EnhanceUtils; import com.zfoo.protocol.registration.field.IFieldRegistration; import com.zfoo.protocol.registration.field.ListField; -import com.zfoo.protocol.registration.field.ObjectProtocolField; +import com.zfoo.protocol.serializer.CodeLanguage; +import com.zfoo.protocol.serializer.CutDownListSerializer; import com.zfoo.protocol.util.StringUtils; import java.lang.reflect.Field; @@ -30,29 +31,12 @@ public class EnhanceListSerializer implements IEnhanceSerializer { @Override public void writeObject(StringBuilder builder, String objectStr, Field field, IFieldRegistration fieldRegistration) { - var listField = (ListField) fieldRegistration; - - // 直接在字节码里调用方法是为了减小生成字节码的体积,下面的代码去掉也不会有任何影响 - switch (listField.getType().getTypeName()) { - case "java.util.List": - builder.append(StringUtils.format("{}.writeIntList($1, (List){});", EnhanceUtils.byteBufUtils, objectStr)); - return; - case "java.util.List": - builder.append(StringUtils.format("{}.writeLongList($1, (List){});", EnhanceUtils.byteBufUtils, objectStr)); - return; - case "java.util.List": - builder.append(StringUtils.format("{}.writeStringList($1, (List){});", EnhanceUtils.byteBufUtils, objectStr)); - return; - default: - } - - // List - if (listField.getListElementRegistration() instanceof ObjectProtocolField) { - var objectProtocolField = (ObjectProtocolField) listField.getListElementRegistration(); - builder.append(StringUtils.format("{}.writePacketList($1, (List){}, {});", EnhanceUtils.byteBufUtils, objectStr, EnhanceUtils.getProtocolRegistrationFieldNameByProtocolId(objectProtocolField.getProtocolId()))); + if (CutDownListSerializer.getInstance().writeObject(builder, objectStr, field, fieldRegistration, CodeLanguage.Enhance)) { return; } + var listField = (ListField) fieldRegistration; + var list = "list" + GenerateProtocolFile.index.getAndIncrement(); builder.append(StringUtils.format("List {} = (List){};", list, objectStr)); @@ -72,28 +56,14 @@ public class EnhanceListSerializer implements IEnhanceSerializer { @Override public String readObject(StringBuilder builder, Field field, IFieldRegistration fieldRegistration) { + var cutDown = CutDownListSerializer.getInstance().readObject(builder, field, fieldRegistration, CodeLanguage.Enhance); + if (cutDown != null) { + return cutDown; + } + var listField = (ListField) fieldRegistration; var list = "list" + GenerateProtocolFile.index.getAndIncrement(); - switch (listField.getType().getTypeName()) { - case "java.util.List": - builder.append(StringUtils.format("List {} = {}.readIntList($1);", list, EnhanceUtils.byteBufUtils)); - return list; - case "java.util.List": - builder.append(StringUtils.format("List {} = {}.readLongList($1);", list, EnhanceUtils.byteBufUtils)); - return list; - case "java.util.List": - builder.append(StringUtils.format("List {} = {}.readStringList($1);", list, EnhanceUtils.byteBufUtils)); - return list; - default: - } - - if (listField.getListElementRegistration() instanceof ObjectProtocolField) { - var objectProtocolField = (ObjectProtocolField) listField.getListElementRegistration(); - builder.append(StringUtils.format("List {} = {}.readPacketList($1, {});", list, EnhanceUtils.byteBufUtils, EnhanceUtils.getProtocolRegistrationFieldNameByProtocolId(objectProtocolField.getProtocolId()))); - return list; - } - var size = "size" + GenerateProtocolFile.index.getAndIncrement(); builder.append(StringUtils.format("int {}={}.readInt($1);", size, EnhanceUtils.byteBufUtils)); diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/enhance/EnhanceMapSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/enhance/EnhanceMapSerializer.java index ce5e5804..f3f026ec 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/enhance/EnhanceMapSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/enhance/EnhanceMapSerializer.java @@ -15,14 +15,10 @@ package com.zfoo.protocol.serializer.enhance; import com.zfoo.protocol.generate.GenerateProtocolFile; import com.zfoo.protocol.registration.EnhanceUtils; -import com.zfoo.protocol.registration.field.BaseField; import com.zfoo.protocol.registration.field.IFieldRegistration; import com.zfoo.protocol.registration.field.MapField; -import com.zfoo.protocol.registration.field.ObjectProtocolField; -import com.zfoo.protocol.serializer.reflect.IntSerializer; -import com.zfoo.protocol.serializer.reflect.LongSerializer; -import com.zfoo.protocol.serializer.reflect.ObjectProtocolSerializer; -import com.zfoo.protocol.serializer.reflect.StringSerializer; +import com.zfoo.protocol.serializer.CodeLanguage; +import com.zfoo.protocol.serializer.CutDownMapSerializer; import com.zfoo.protocol.util.StringUtils; import java.lang.reflect.Field; @@ -36,58 +32,16 @@ public class EnhanceMapSerializer implements IEnhanceSerializer { @Override public void writeObject(StringBuilder builder, String objectStr, Field field, IFieldRegistration fieldRegistration) { + if (CutDownMapSerializer.getInstance().writeObject(builder, objectStr, field, fieldRegistration, CodeLanguage.Enhance)) { + return; + } + var mapField = (MapField) fieldRegistration; var keyRegistration = mapField.getMapKeyRegistration(); var valueRegistration = mapField.getMapValueRegistration(); var keySerializer = keyRegistration.serializer(); var valueSerializer = valueRegistration.serializer(); - // 直接在字节码里调用方法是为了减小生成字节码的体积,下面的代码去掉也不会有任何影响 - if (keyRegistration instanceof BaseField) { - if (valueRegistration instanceof BaseField) { - if (keySerializer == IntSerializer.INSTANCE && valueSerializer == IntSerializer.INSTANCE) { - builder.append(StringUtils.format("{}.writeIntIntMap($1, (Map){});", EnhanceUtils.byteBufUtils, objectStr)); - return; - } else if (keySerializer == IntSerializer.INSTANCE && valueSerializer == LongSerializer.INSTANCE) { - builder.append(StringUtils.format("{}.writeIntLongMap($1, (Map){});", EnhanceUtils.byteBufUtils, objectStr)); - return; - } else if (keySerializer == IntSerializer.INSTANCE && valueSerializer == StringSerializer.INSTANCE) { - builder.append(StringUtils.format("{}.writeIntStringMap($1, (Map){});", EnhanceUtils.byteBufUtils, objectStr)); - return; - } else if (keySerializer == LongSerializer.INSTANCE && valueSerializer == IntSerializer.INSTANCE) { - builder.append(StringUtils.format("{}.writeLongIntMap($1, (Map){});", EnhanceUtils.byteBufUtils, objectStr)); - return; - } else if (keySerializer == LongSerializer.INSTANCE && valueSerializer == LongSerializer.INSTANCE) { - builder.append(StringUtils.format("{}.writeLongLongMap($1, (Map){});", EnhanceUtils.byteBufUtils, objectStr)); - return; - } else if (keySerializer == LongSerializer.INSTANCE && valueSerializer == StringSerializer.INSTANCE) { - builder.append(StringUtils.format("{}.writeLongStringMap($1, (Map){});", EnhanceUtils.byteBufUtils, objectStr)); - return; - } else if (keySerializer == StringSerializer.INSTANCE && valueSerializer == IntSerializer.INSTANCE) { - builder.append(StringUtils.format("{}.writeStringIntMap($1, (Map){});", EnhanceUtils.byteBufUtils, objectStr)); - return; - } else if (keySerializer == StringSerializer.INSTANCE && valueSerializer == LongSerializer.INSTANCE) { - builder.append(StringUtils.format("{}.writeStringLongMap($1, (Map){});", EnhanceUtils.byteBufUtils, objectStr)); - return; - } else if (keySerializer == StringSerializer.INSTANCE && valueSerializer == StringSerializer.INSTANCE) { - builder.append(StringUtils.format("{}.writeStringStringMap($1, (Map){});", EnhanceUtils.byteBufUtils, objectStr)); - return; - } - } else if (valueRegistration instanceof ObjectProtocolField) { - var valueProtocolRegistration = (ObjectProtocolField) valueRegistration; - if (keySerializer == IntSerializer.INSTANCE && valueSerializer == ObjectProtocolSerializer.INSTANCE) { - builder.append(StringUtils.format("{}.writeIntPacketMap($1, (Map){}, {});", EnhanceUtils.byteBufUtils, objectStr, EnhanceUtils.getProtocolRegistrationFieldNameByProtocolId(valueProtocolRegistration.getProtocolId()))); - return; - } else if (keySerializer == LongSerializer.INSTANCE && valueSerializer == ObjectProtocolSerializer.INSTANCE) { - builder.append(StringUtils.format("{}.writeLongPacketMap($1, (Map){}, {});", EnhanceUtils.byteBufUtils, objectStr, EnhanceUtils.getProtocolRegistrationFieldNameByProtocolId(valueProtocolRegistration.getProtocolId()))); - return; - } else if (keySerializer == StringSerializer.INSTANCE && valueSerializer == ObjectProtocolSerializer.INSTANCE) { - builder.append(StringUtils.format("{}.writeStringPacketMap($1, (Map){}, {});", EnhanceUtils.byteBufUtils, objectStr, EnhanceUtils.getProtocolRegistrationFieldNameByProtocolId(valueProtocolRegistration.getProtocolId()))); - return; - } - } - } - var map = "map" + GenerateProtocolFile.index.getAndIncrement(); builder.append(StringUtils.format("Map {} = (Map){};", map, objectStr)); builder.append(StringUtils.format("{}.writeInt($1, CollectionUtils.size({}));", EnhanceUtils.byteBufUtils, map)); @@ -113,59 +67,17 @@ public class EnhanceMapSerializer implements IEnhanceSerializer { @Override public String readObject(StringBuilder builder, Field field, IFieldRegistration fieldRegistration) { + var cutDown = CutDownMapSerializer.getInstance().readObject(builder, field, fieldRegistration, CodeLanguage.Enhance); + if (cutDown != null) { + return cutDown; + } + var mapField = (MapField) fieldRegistration; var keyRegistration = mapField.getMapKeyRegistration(); var valueRegistration = mapField.getMapValueRegistration(); - var keySerializer = keyRegistration.serializer(); - var valueSerializer = valueRegistration.serializer(); var map = "map" + GenerateProtocolFile.index.getAndIncrement(); - if (keyRegistration instanceof BaseField) { - if (valueRegistration instanceof BaseField) { - if (keySerializer == IntSerializer.INSTANCE && valueSerializer == IntSerializer.INSTANCE) { - builder.append(StringUtils.format("Map {} = {}.readIntIntMap($1);", map, EnhanceUtils.byteBufUtils)); - return map; - } else if (keySerializer == IntSerializer.INSTANCE && valueSerializer == LongSerializer.INSTANCE) { - builder.append(StringUtils.format("Map {} = {}.readIntLongMap($1);", map, EnhanceUtils.byteBufUtils)); - return map; - } else if (keySerializer == IntSerializer.INSTANCE && valueSerializer == StringSerializer.INSTANCE) { - builder.append(StringUtils.format("Map {} = {}.readIntStringMap($1);", map, EnhanceUtils.byteBufUtils)); - return map; - } else if (keySerializer == LongSerializer.INSTANCE && valueSerializer == IntSerializer.INSTANCE) { - builder.append(StringUtils.format("Map {} = {}.readLongIntMap($1);", map, EnhanceUtils.byteBufUtils)); - return map; - } else if (keySerializer == LongSerializer.INSTANCE && valueSerializer == LongSerializer.INSTANCE) { - builder.append(StringUtils.format("Map {} = {}.readLongLongMap($1);", map, EnhanceUtils.byteBufUtils)); - return map; - } else if (keySerializer == LongSerializer.INSTANCE && valueSerializer == StringSerializer.INSTANCE) { - builder.append(StringUtils.format("Map {} = {}.readLongStringMap($1);", map, EnhanceUtils.byteBufUtils)); - return map; - } else if (keySerializer == StringSerializer.INSTANCE && valueSerializer == IntSerializer.INSTANCE) { - builder.append(StringUtils.format("Map {} = {}.readStringIntMap($1);", map, EnhanceUtils.byteBufUtils)); - return map; - } else if (keySerializer == StringSerializer.INSTANCE && valueSerializer == LongSerializer.INSTANCE) { - builder.append(StringUtils.format("Map {} = {}.readStringLongMap($1);", map, EnhanceUtils.byteBufUtils)); - return map; - } else if (keySerializer == StringSerializer.INSTANCE && valueSerializer == StringSerializer.INSTANCE) { - builder.append(StringUtils.format("Map {} = {}.readStringStringMap($1);", map, EnhanceUtils.byteBufUtils)); - return map; - } - } else if (valueRegistration instanceof ObjectProtocolField) { - var valueProtocolRegistration = (ObjectProtocolField) valueRegistration; - if (keySerializer == IntSerializer.INSTANCE && valueSerializer == ObjectProtocolSerializer.INSTANCE) { - builder.append(StringUtils.format("Map {} = {}.readIntPacketMap($1, {});", map, EnhanceUtils.byteBufUtils, EnhanceUtils.getProtocolRegistrationFieldNameByProtocolId(valueProtocolRegistration.getProtocolId()))); - return map; - } else if (keySerializer == LongSerializer.INSTANCE && valueSerializer == ObjectProtocolSerializer.INSTANCE) { - builder.append(StringUtils.format("Map {} = {}.readLongPacketMap($1, {});", map, EnhanceUtils.byteBufUtils, EnhanceUtils.getProtocolRegistrationFieldNameByProtocolId(valueProtocolRegistration.getProtocolId()))); - return map; - } else if (keySerializer == StringSerializer.INSTANCE && valueSerializer == ObjectProtocolSerializer.INSTANCE) { - builder.append(StringUtils.format("Map {} = {}.readStringPacketMap($1, {});", map, EnhanceUtils.byteBufUtils, EnhanceUtils.getProtocolRegistrationFieldNameByProtocolId(valueProtocolRegistration.getProtocolId()))); - return map; - } - } - } - var size = "size" + GenerateProtocolFile.index.getAndIncrement(); builder.append(StringUtils.format("int {}={}.readInt($1);", size, EnhanceUtils.byteBufUtils)); builder.append(StringUtils.format("Map {} = CollectionUtils.newFixedMap({});", map, size)); diff --git a/protocol/src/main/java/com/zfoo/protocol/serializer/enhance/EnhanceSetSerializer.java b/protocol/src/main/java/com/zfoo/protocol/serializer/enhance/EnhanceSetSerializer.java index 4129202c..dc403aec 100644 --- a/protocol/src/main/java/com/zfoo/protocol/serializer/enhance/EnhanceSetSerializer.java +++ b/protocol/src/main/java/com/zfoo/protocol/serializer/enhance/EnhanceSetSerializer.java @@ -16,8 +16,9 @@ package com.zfoo.protocol.serializer.enhance; import com.zfoo.protocol.generate.GenerateProtocolFile; import com.zfoo.protocol.registration.EnhanceUtils; import com.zfoo.protocol.registration.field.IFieldRegistration; -import com.zfoo.protocol.registration.field.ObjectProtocolField; import com.zfoo.protocol.registration.field.SetField; +import com.zfoo.protocol.serializer.CodeLanguage; +import com.zfoo.protocol.serializer.CutDownSetSerializer; import com.zfoo.protocol.util.StringUtils; import java.lang.reflect.Field; @@ -30,29 +31,11 @@ public class EnhanceSetSerializer implements IEnhanceSerializer { @Override public void writeObject(StringBuilder builder, String objectStr, Field field, IFieldRegistration fieldRegistration) { - var setField = (SetField) fieldRegistration; - - // 直接在字节码里调用方法是为了减小生成字节码的体积,下面的代码去掉也不会有任何影响 - switch (setField.getType().getTypeName()) { - case "java.util.Set": - builder.append(StringUtils.format("{}.writeIntSet($1, (Set){});", EnhanceUtils.byteBufUtils, objectStr)); - return; - case "java.util.Set": - builder.append(StringUtils.format("{}.writeLongSet($1, (Set){});", EnhanceUtils.byteBufUtils, objectStr)); - return; - case "java.util.Set": - builder.append(StringUtils.format("{}.writeStringSet($1, (Set){});", EnhanceUtils.byteBufUtils, objectStr)); - return; - default: - } - - // Set - if (setField.getSetElementRegistration() instanceof ObjectProtocolField) { - var objectProtocolField = (ObjectProtocolField) setField.getSetElementRegistration(); - builder.append(StringUtils.format("{}.writePacketSet($1, (Set){}, {});", EnhanceUtils.byteBufUtils, objectStr, EnhanceUtils.getProtocolRegistrationFieldNameByProtocolId(objectProtocolField.getProtocolId()))); + if (CutDownSetSerializer.getInstance().writeObject(builder, objectStr, field, fieldRegistration, CodeLanguage.Enhance)) { return; } + var setField = (SetField) fieldRegistration; var set = "set" + GenerateProtocolFile.index.getAndIncrement(); builder.append(StringUtils.format("Set {} = (Set){};", set, objectStr)); @@ -72,28 +55,14 @@ public class EnhanceSetSerializer implements IEnhanceSerializer { @Override public String readObject(StringBuilder builder, Field field, IFieldRegistration fieldRegistration) { + var cutDown = CutDownSetSerializer.getInstance().readObject(builder, field, fieldRegistration, CodeLanguage.Enhance); + if (cutDown != null) { + return cutDown; + } + var setField = (SetField) fieldRegistration; var set = "set" + GenerateProtocolFile.index.getAndIncrement(); - switch (setField.getType().getTypeName()) { - case "java.util.Set": - builder.append(StringUtils.format("Set {} = {}.readIntSet($1);", set, EnhanceUtils.byteBufUtils)); - return set; - case "java.util.Set": - builder.append(StringUtils.format("Set {} = {}.readLongSet($1);", set, EnhanceUtils.byteBufUtils)); - return set; - case "java.util.Set": - builder.append(StringUtils.format("Set {} = {}.readStringSet($1);", set, EnhanceUtils.byteBufUtils)); - return set; - default: - } - - if (setField.getSetElementRegistration() instanceof ObjectProtocolField) { - var objectProtocolField = (ObjectProtocolField) setField.getSetElementRegistration(); - builder.append(StringUtils.format("Set {} = {}.readPacketSet($1, {});", set, EnhanceUtils.byteBufUtils, EnhanceUtils.getProtocolRegistrationFieldNameByProtocolId(objectProtocolField.getProtocolId()))); - return set; - } - var size = "size" + GenerateProtocolFile.index.getAndIncrement(); builder.append(StringUtils.format("int {} = {}.readInt($1);", size, EnhanceUtils.byteBufUtils)); builder.append(StringUtils.format("Set {} = CollectionUtils.newFixedSet({});", set, size));