ref[protocol]: 重构protocol,将精简代码的模块提取到ICutDownSerializer

This commit is contained in:
jaysunxiao
2021-10-15 17:12:04 +08:00
parent edfbbb97e9
commit 786a0f051e
10 changed files with 789 additions and 300 deletions
@@ -18,6 +18,11 @@ package com.zfoo.protocol.serializer;
*/
public enum CodeLanguage {
/**
* Javassist字节码增强
*/
Enhance,
JavaScript,
Lua,
@@ -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);
}
}
@@ -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<java.lang.Integer>":
switch (language) {
case Enhance:
builder.append(StringUtils.format("{}.writeIntList($1, (List){});", EnhanceUtils.byteBufUtils, objectStr));
return true;
}
break;
case "java.util.List<java.lang.Long>": {
switch (language) {
case Enhance:
builder.append(StringUtils.format("{}.writeLongList($1, (List){});", EnhanceUtils.byteBufUtils, objectStr));
return true;
}
break;
}
case "java.util.List<java.lang.String>":
switch (language) {
case Enhance:
builder.append(StringUtils.format("{}.writeStringList($1, (List){});", EnhanceUtils.byteBufUtils, objectStr));
return true;
}
break;
default:
}
// List<IPacket>
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<java.lang.Integer>":
switch (language) {
case Enhance:
builder.append(StringUtils.format("List {} = {}.readIntList($1);", list, EnhanceUtils.byteBufUtils));
return list;
}
break;
case "java.util.List<java.lang.Long>":
switch (language) {
case Enhance:
builder.append(StringUtils.format("List {} = {}.readLongList($1);", list, EnhanceUtils.byteBufUtils));
return list;
}
break;
case "java.util.List<java.lang.String>":
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;
}
}
@@ -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;
}
}
@@ -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<java.lang.Integer>":
switch (language) {
case Enhance:
builder.append(StringUtils.format("{}.writeIntSet($1, (Set){});", EnhanceUtils.byteBufUtils, objectStr));
return true;
}
break;
case "java.util.Set<java.lang.Long>":
switch (language) {
case Enhance:
builder.append(StringUtils.format("{}.writeLongSet($1, (Set){});", EnhanceUtils.byteBufUtils, objectStr));
return true;
}
break;
case "java.util.Set<java.lang.String>":
switch (language) {
case Enhance:
builder.append(StringUtils.format("{}.writeStringSet($1, (Set){});", EnhanceUtils.byteBufUtils, objectStr));
return true;
}
break;
default:
}
// Set<IPacket>
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<java.lang.Integer>":
switch (language) {
case Enhance:
builder.append(StringUtils.format("Set {} = {}.readIntSet($1);", set, EnhanceUtils.byteBufUtils));
return set;
}
break;
case "java.util.Set<java.lang.Long>":
switch (language) {
case Enhance:
builder.append(StringUtils.format("Set {} = {}.readLongSet($1);", set, EnhanceUtils.byteBufUtils));
return set;
}
break;
case "java.util.Set<java.lang.String>":
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;
}
}
@@ -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);
}
@@ -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);
}
}
@@ -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<java.lang.Integer>":
builder.append(StringUtils.format("{}.writeIntList($1, (List){});", EnhanceUtils.byteBufUtils, objectStr));
return;
case "java.util.List<java.lang.Long>":
builder.append(StringUtils.format("{}.writeLongList($1, (List){});", EnhanceUtils.byteBufUtils, objectStr));
return;
case "java.util.List<java.lang.String>":
builder.append(StringUtils.format("{}.writeStringList($1, (List){});", EnhanceUtils.byteBufUtils, objectStr));
return;
default:
}
// List<IPacket>
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<java.lang.Integer>":
builder.append(StringUtils.format("List {} = {}.readIntList($1);", list, EnhanceUtils.byteBufUtils));
return list;
case "java.util.List<java.lang.Long>":
builder.append(StringUtils.format("List {} = {}.readLongList($1);", list, EnhanceUtils.byteBufUtils));
return list;
case "java.util.List<java.lang.String>":
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));
@@ -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));
@@ -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<java.lang.Integer>":
builder.append(StringUtils.format("{}.writeIntSet($1, (Set){});", EnhanceUtils.byteBufUtils, objectStr));
return;
case "java.util.Set<java.lang.Long>":
builder.append(StringUtils.format("{}.writeLongSet($1, (Set){});", EnhanceUtils.byteBufUtils, objectStr));
return;
case "java.util.Set<java.lang.String>":
builder.append(StringUtils.format("{}.writeStringSet($1, (Set){});", EnhanceUtils.byteBufUtils, objectStr));
return;
default:
}
// Set<IPacket>
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<java.lang.Integer>":
builder.append(StringUtils.format("Set {} = {}.readIntSet($1);", set, EnhanceUtils.byteBufUtils));
return set;
case "java.util.Set<java.lang.Long>":
builder.append(StringUtils.format("Set {} = {}.readLongSet($1);", set, EnhanceUtils.byteBufUtils));
return set;
case "java.util.Set<java.lang.String>":
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));