mirror of
https://github.com/tiennm99/zfoo.git
synced 2026-08-18 04:28:40 +00:00
ref[protocol]: 重构protocol,将精简代码的模块提取到ICutDownSerializer
This commit is contained in:
@@ -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);
|
||||
|
||||
}
|
||||
+14
-121
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+10
-40
@@ -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));
|
||||
|
||||
|
||||
+11
-99
@@ -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));
|
||||
|
||||
+9
-40
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user