protobuf
This commit is contained in:
@@ -8,6 +8,8 @@ import java.lang.reflect.Field;
|
|||||||
import java.lang.reflect.Type;
|
import java.lang.reflect.Type;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
import java.util.concurrent.atomic.AtomicLong;
|
||||||
import org.redkale.asm.Asms;
|
import org.redkale.asm.Asms;
|
||||||
import org.redkale.asm.ClassWriter;
|
import org.redkale.asm.ClassWriter;
|
||||||
import static org.redkale.asm.ClassWriter.COMPUTE_FRAMES;
|
import static org.redkale.asm.ClassWriter.COMPUTE_FRAMES;
|
||||||
@@ -67,9 +69,9 @@ public abstract class ProtobufDynEncoder<T> extends ProtobufObjectEncoder<T> {
|
|||||||
final Class fieldClass = member.getAttribute().type();
|
final Class fieldClass = member.getAttribute().type();
|
||||||
final Type fieldType = member.getAttribute().genericType();
|
final Type fieldType = member.getAttribute().genericType();
|
||||||
elementb.append(fieldName).append(',');
|
elementb.append(fieldName).append(',');
|
||||||
if (!ProtobufWriter.isSimpleType(fieldClass)
|
if (!ProtobufFactory.isSimpleType(fieldClass)
|
||||||
&& !fieldClass.isEnum()
|
&& !fieldClass.isEnum()
|
||||||
&& !ProtobufWriter.supportSimpleCollectionType(fieldType)) {
|
&& !ProtobufFactory.supportSimpleCollectionType(fieldType)) {
|
||||||
if ((member.getEncoder() instanceof SimpledCoder)) {
|
if ((member.getEncoder() instanceof SimpledCoder)) {
|
||||||
simpledCoders.put(fieldName, (SimpledCoder) member.getEncoder());
|
simpledCoders.put(fieldName, (SimpledCoder) member.getEncoder());
|
||||||
} else {
|
} else {
|
||||||
@@ -185,7 +187,7 @@ public abstract class ProtobufDynEncoder<T> extends ProtobufObjectEncoder<T> {
|
|||||||
final String fieldName = member.getAttribute().field();
|
final String fieldName = member.getAttribute().field();
|
||||||
final Type fieldType = member.getAttribute().genericType();
|
final Type fieldType = member.getAttribute().genericType();
|
||||||
final Class fieldClass = member.getAttribute().type();
|
final Class fieldClass = member.getAttribute().type();
|
||||||
if (ProtobufWriter.isSimpleType(fieldClass)) {
|
if (ProtobufFactory.isSimpleType(fieldClass)) {
|
||||||
mv.visitVarInsn(ALOAD, 3); // out
|
mv.visitVarInsn(ALOAD, 3); // out
|
||||||
Asms.visitInsn(mv, member.getTag()); // tag
|
Asms.visitInsn(mv, member.getTag()); // tag
|
||||||
mv.visitVarInsn(ALOAD, 2); // value
|
mv.visitVarInsn(ALOAD, 2); // value
|
||||||
@@ -216,7 +218,7 @@ public abstract class ProtobufDynEncoder<T> extends ProtobufObjectEncoder<T> {
|
|||||||
mv.visitFieldInsn(GETFIELD, valtypeName, fname, fdesc);
|
mv.visitFieldInsn(GETFIELD, valtypeName, fname, fdesc);
|
||||||
}
|
}
|
||||||
mv.visitMethodInsn(INVOKEVIRTUAL, pbwriterName, "writeFieldValue", "(ILjava/lang/Enum;)V", false);
|
mv.visitMethodInsn(INVOKEVIRTUAL, pbwriterName, "writeFieldValue", "(ILjava/lang/Enum;)V", false);
|
||||||
} else if (ProtobufWriter.supportSimpleCollectionType(fieldType)) {
|
} else if (ProtobufFactory.supportSimpleCollectionType(fieldType)) {
|
||||||
mv.visitVarInsn(ALOAD, 3); // out
|
mv.visitVarInsn(ALOAD, 3); // out
|
||||||
Asms.visitInsn(mv, member.getTag()); // tag
|
Asms.visitInsn(mv, member.getTag()); // tag
|
||||||
mv.visitVarInsn(ALOAD, 2); // value
|
mv.visitVarInsn(ALOAD, 2); // value
|
||||||
@@ -230,7 +232,7 @@ public abstract class ProtobufDynEncoder<T> extends ProtobufObjectEncoder<T> {
|
|||||||
String fdesc = org.redkale.asm.Type.getDescriptor(field.getType());
|
String fdesc = org.redkale.asm.Type.getDescriptor(field.getType());
|
||||||
mv.visitFieldInsn(GETFIELD, valtypeName, fname, fdesc);
|
mv.visitFieldInsn(GETFIELD, valtypeName, fname, fdesc);
|
||||||
}
|
}
|
||||||
Class componentType = ProtobufWriter.getSimpleCollectionComponentType(fieldType);
|
Class componentType = ProtobufFactory.getSimpleCollectionComponentType(fieldType);
|
||||||
String wmethodName = null;
|
String wmethodName = null;
|
||||||
if (componentType == Boolean.class) {
|
if (componentType == Boolean.class) {
|
||||||
wmethodName = "writeFieldBoolsValue";
|
wmethodName = "writeFieldBoolsValue";
|
||||||
@@ -248,6 +250,10 @@ public abstract class ProtobufDynEncoder<T> extends ProtobufObjectEncoder<T> {
|
|||||||
wmethodName = "writeFieldLongsValue";
|
wmethodName = "writeFieldLongsValue";
|
||||||
} else if (componentType == Double.class) {
|
} else if (componentType == Double.class) {
|
||||||
wmethodName = "writeFieldDoublesValue";
|
wmethodName = "writeFieldDoublesValue";
|
||||||
|
} else if (componentType == AtomicInteger.class) {
|
||||||
|
wmethodName = "writeFieldAtomicIntegersValue";
|
||||||
|
} else if (componentType == AtomicLong.class) {
|
||||||
|
wmethodName = "writeFieldAtomicLongsValue";
|
||||||
} else if (componentType == String.class) {
|
} else if (componentType == String.class) {
|
||||||
wmethodName = "writeFieldStringValue";
|
wmethodName = "writeFieldStringValue";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -228,6 +228,76 @@ public class ProtobufFactory extends ConvertFactory<ProtobufReader, ProtobufWrit
|
|||||||
|| type == AtomicLong.class;
|
|| type == AtomicLong.class;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected static boolean isSimpleType(Class fieldClass) {
|
||||||
|
return fieldClass.isPrimitive()
|
||||||
|
|| fieldClass == Boolean.class
|
||||||
|
|| fieldClass == Byte.class
|
||||||
|
|| fieldClass == Character.class
|
||||||
|
|| fieldClass == Short.class
|
||||||
|
|| fieldClass == Integer.class
|
||||||
|
|| fieldClass == Float.class
|
||||||
|
|| fieldClass == Long.class
|
||||||
|
|| fieldClass == Double.class
|
||||||
|
|| fieldClass == AtomicInteger.class
|
||||||
|
|| fieldClass == AtomicLong.class
|
||||||
|
|| fieldClass == String.class
|
||||||
|
|| fieldClass == boolean[].class
|
||||||
|
|| fieldClass == byte[].class
|
||||||
|
|| fieldClass == char[].class
|
||||||
|
|| fieldClass == short[].class
|
||||||
|
|| fieldClass == int[].class
|
||||||
|
|| fieldClass == float[].class
|
||||||
|
|| fieldClass == long[].class
|
||||||
|
|| fieldClass == double[].class
|
||||||
|
|| fieldClass == Boolean[].class
|
||||||
|
|| fieldClass == Byte[].class
|
||||||
|
|| fieldClass == Character[].class
|
||||||
|
|| fieldClass == Short[].class
|
||||||
|
|| fieldClass == Integer[].class
|
||||||
|
|| fieldClass == Float[].class
|
||||||
|
|| fieldClass == Long[].class
|
||||||
|
|| fieldClass == Double[].class
|
||||||
|
|| fieldClass == AtomicInteger[].class
|
||||||
|
|| fieldClass == AtomicLong[].class
|
||||||
|
|| fieldClass == String[].class;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static boolean supportSimpleCollectionType(Type type) {
|
||||||
|
if (!(type instanceof ParameterizedType)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
ParameterizedType ptype = (ParameterizedType) type;
|
||||||
|
if (!(ptype.getRawType() instanceof Class)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Type[] ptargs = ptype.getActualTypeArguments();
|
||||||
|
if (ptargs == null || ptargs.length != 1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Class ownerType = (Class) ptype.getRawType();
|
||||||
|
if (!Collection.class.isAssignableFrom(ownerType)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Type componentType = ptargs[0];
|
||||||
|
return componentType == Boolean.class
|
||||||
|
|| componentType == Byte.class
|
||||||
|
|| componentType == Character.class
|
||||||
|
|| componentType == Short.class
|
||||||
|
|| componentType == Integer.class
|
||||||
|
|| componentType == Float.class
|
||||||
|
|| componentType == Long.class
|
||||||
|
|| componentType == Double.class
|
||||||
|
|| componentType == AtomicInteger.class
|
||||||
|
|| componentType == AtomicLong.class
|
||||||
|
|| componentType == String.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Class getSimpleCollectionComponentType(Type type) {
|
||||||
|
return supportSimpleCollectionType(type)
|
||||||
|
? (Class) ((ParameterizedType) type).getActualTypeArguments()[0]
|
||||||
|
: null;
|
||||||
|
}
|
||||||
|
|
||||||
public static int getTag(String fieldName, Type fieldType, int fieldPos, boolean enumtostring) {
|
public static int getTag(String fieldName, Type fieldType, int fieldPos, boolean enumtostring) {
|
||||||
int wiretype = ProtobufFactory.wireType(fieldType, enumtostring);
|
int wiretype = ProtobufFactory.wireType(fieldType, enumtostring);
|
||||||
return (fieldPos << 3 | wiretype);
|
return (fieldPos << 3 | wiretype);
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
*/
|
*/
|
||||||
package org.redkale.convert.pb;
|
package org.redkale.convert.pb;
|
||||||
|
|
||||||
import java.lang.reflect.ParameterizedType;
|
|
||||||
import java.lang.reflect.Type;
|
import java.lang.reflect.Type;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
@@ -872,6 +871,62 @@ public class ProtobufWriter extends Writer implements ByteTuple {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void writeAtomicIntegers(AtomicInteger[] value) {
|
||||||
|
AtomicInteger[] array = value;
|
||||||
|
if (array != null && array.length > 0) {
|
||||||
|
int len = 0;
|
||||||
|
for (AtomicInteger item : array) {
|
||||||
|
len += computeSInt32SizeNoTag(item == null ? 0 : item.get());
|
||||||
|
}
|
||||||
|
writeLength(len);
|
||||||
|
for (AtomicInteger item : array) {
|
||||||
|
writeInt(item == null ? 0 : item.get());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void writeAtomicIntegers(Collection<AtomicInteger> value) {
|
||||||
|
Collection<AtomicInteger> array = value;
|
||||||
|
if (array != null && !array.isEmpty()) {
|
||||||
|
int len = 0;
|
||||||
|
for (AtomicInteger item : array) {
|
||||||
|
len += computeSInt32SizeNoTag(item == null ? 0 : item.get());
|
||||||
|
}
|
||||||
|
writeLength(len);
|
||||||
|
for (AtomicInteger item : array) {
|
||||||
|
writeInt(item == null ? 0 : item.get());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void writeAtomicLongs(AtomicLong[] value) {
|
||||||
|
AtomicLong[] array = value;
|
||||||
|
if (array != null && array.length > 0) {
|
||||||
|
int len = 0;
|
||||||
|
for (AtomicLong item : array) {
|
||||||
|
len += computeSInt64SizeNoTag(item == null ? 0 : item.get());
|
||||||
|
}
|
||||||
|
writeLength(len);
|
||||||
|
for (AtomicLong item : array) {
|
||||||
|
writeLong(item == null ? 0 : item.get());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void writeAtomicLongs(Collection<AtomicLong> value) {
|
||||||
|
Collection<AtomicLong> array = value;
|
||||||
|
if (array != null && !array.isEmpty()) {
|
||||||
|
int len = 0;
|
||||||
|
for (AtomicLong item : array) {
|
||||||
|
len += computeSInt64SizeNoTag(item == null ? 0 : item.get());
|
||||||
|
}
|
||||||
|
writeLength(len);
|
||||||
|
for (AtomicLong item : array) {
|
||||||
|
writeLong(item == null ? 0 : item.get());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void writeWrapper(StringWrapper value) {
|
public void writeWrapper(StringWrapper value) {
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
@@ -1023,6 +1078,24 @@ public class ProtobufWriter extends Writer implements ByteTuple {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ClassDepends
|
||||||
|
public void writeFieldValue(int tag, AtomicInteger value) {
|
||||||
|
if (value != null && value.get() != 0) {
|
||||||
|
writeTag(tag);
|
||||||
|
writeInt(value.get());
|
||||||
|
this.comma = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@ClassDepends
|
||||||
|
public void writeFieldValue(int tag, AtomicLong value) {
|
||||||
|
if (value != null && value.get() != 0) {
|
||||||
|
writeTag(tag);
|
||||||
|
writeLong(value.get());
|
||||||
|
this.comma = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@ClassDepends
|
@ClassDepends
|
||||||
public void writeFieldValue(int tag, boolean[] value) {
|
public void writeFieldValue(int tag, boolean[] value) {
|
||||||
if (value != null && value.length > 0) {
|
if (value != null && value.length > 0) {
|
||||||
@@ -1167,6 +1240,24 @@ public class ProtobufWriter extends Writer implements ByteTuple {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ClassDepends
|
||||||
|
public void writeFieldValue(int tag, AtomicInteger[] value) {
|
||||||
|
if (value != null && value.length > 0) {
|
||||||
|
writeTag(tag);
|
||||||
|
writeAtomicIntegers(value);
|
||||||
|
this.comma = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@ClassDepends
|
||||||
|
public void writeFieldValue(int tag, AtomicLong[] value) {
|
||||||
|
if (value != null && value.length > 0) {
|
||||||
|
writeTag(tag);
|
||||||
|
writeAtomicLongs(value);
|
||||||
|
this.comma = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@ClassDepends
|
@ClassDepends
|
||||||
public void writeFieldValue(int tag, String[] value) {
|
public void writeFieldValue(int tag, String[] value) {
|
||||||
if (value != null && value.length > 0) {
|
if (value != null && value.length > 0) {
|
||||||
@@ -1247,6 +1338,24 @@ public class ProtobufWriter extends Writer implements ByteTuple {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ClassDepends
|
||||||
|
public void writeFieldAtomicIntegersValue(int tag, Collection<AtomicInteger> value) {
|
||||||
|
if (value != null && !value.isEmpty()) {
|
||||||
|
writeTag(tag);
|
||||||
|
writeAtomicIntegers(value);
|
||||||
|
this.comma = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@ClassDepends
|
||||||
|
public void writeFieldAtomicLongsValue(int tag, Collection<AtomicLong> value) {
|
||||||
|
if (value != null && !value.isEmpty()) {
|
||||||
|
writeTag(tag);
|
||||||
|
writeAtomicLongs(value);
|
||||||
|
this.comma = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@ClassDepends
|
@ClassDepends
|
||||||
public void writeFieldStringsValue(int tag, Collection<String> value) {
|
public void writeFieldStringsValue(int tag, Collection<String> value) {
|
||||||
if (value != null && !value.isEmpty()) {
|
if (value != null && !value.isEmpty()) {
|
||||||
@@ -1535,70 +1644,6 @@ public class ProtobufWriter extends Writer implements ByteTuple {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isSimpleType(Class fieldClass) {
|
|
||||||
return fieldClass.isPrimitive()
|
|
||||||
|| fieldClass == Boolean.class
|
|
||||||
|| fieldClass == Byte.class
|
|
||||||
|| fieldClass == Character.class
|
|
||||||
|| fieldClass == Short.class
|
|
||||||
|| fieldClass == Integer.class
|
|
||||||
|| fieldClass == Float.class
|
|
||||||
|| fieldClass == Long.class
|
|
||||||
|| fieldClass == Double.class
|
|
||||||
|| fieldClass == String.class
|
|
||||||
|| fieldClass == boolean[].class
|
|
||||||
|| fieldClass == byte[].class
|
|
||||||
|| fieldClass == char[].class
|
|
||||||
|| fieldClass == short[].class
|
|
||||||
|| fieldClass == int[].class
|
|
||||||
|| fieldClass == float[].class
|
|
||||||
|| fieldClass == long[].class
|
|
||||||
|| fieldClass == double[].class
|
|
||||||
|| fieldClass == Boolean[].class
|
|
||||||
|| fieldClass == Byte[].class
|
|
||||||
|| fieldClass == Character[].class
|
|
||||||
|| fieldClass == Short[].class
|
|
||||||
|| fieldClass == Integer[].class
|
|
||||||
|| fieldClass == Float[].class
|
|
||||||
|| fieldClass == Long[].class
|
|
||||||
|| fieldClass == Double[].class
|
|
||||||
|| fieldClass == String[].class;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean supportSimpleCollectionType(Type type) {
|
|
||||||
if (!(type instanceof ParameterizedType)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
ParameterizedType ptype = (ParameterizedType) type;
|
|
||||||
if (!(ptype.getRawType() instanceof Class)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Type[] ptargs = ptype.getActualTypeArguments();
|
|
||||||
if (ptargs == null || ptargs.length != 1) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Class ownerType = (Class) ptype.getRawType();
|
|
||||||
if (!Collection.class.isAssignableFrom(ownerType)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Type componentType = ptargs[0];
|
|
||||||
return componentType == Boolean.class
|
|
||||||
|| componentType == Byte.class
|
|
||||||
|| componentType == Character.class
|
|
||||||
|| componentType == Short.class
|
|
||||||
|| componentType == Integer.class
|
|
||||||
|| componentType == Float.class
|
|
||||||
|| componentType == Long.class
|
|
||||||
|| componentType == Double.class
|
|
||||||
|| componentType == String.class;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Class getSimpleCollectionComponentType(Type type) {
|
|
||||||
return supportSimpleCollectionType(type)
|
|
||||||
? (Class) ((ParameterizedType) type).getActualTypeArguments()[0]
|
|
||||||
: null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// see com.google.protobuf.CodedOutputStream
|
// see com.google.protobuf.CodedOutputStream
|
||||||
protected static int computeInt32SizeNoTag(final int value) {
|
protected static int computeInt32SizeNoTag(final int value) {
|
||||||
if (value == 0) {
|
if (value == 0) {
|
||||||
|
|||||||
@@ -9,6 +9,8 @@ import java.math.BigInteger;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
import java.util.concurrent.atomic.AtomicLong;
|
||||||
import org.redkale.convert.ConvertColumn;
|
import org.redkale.convert.ConvertColumn;
|
||||||
import org.redkale.convert.json.JsonConvert;
|
import org.redkale.convert.json.JsonConvert;
|
||||||
import org.redkale.persistence.Id;
|
import org.redkale.persistence.Id;
|
||||||
@@ -145,6 +147,12 @@ public class UserBean {
|
|||||||
@ConvertColumn(index = 42)
|
@ConvertColumn(index = 42)
|
||||||
public UserKind kind;
|
public UserKind kind;
|
||||||
|
|
||||||
|
@ConvertColumn(index = 43)
|
||||||
|
public AtomicInteger count;
|
||||||
|
|
||||||
|
@ConvertColumn(index = 44)
|
||||||
|
public AtomicLong[] count2;
|
||||||
|
|
||||||
public Map<String, String> getMap() {
|
public Map<String, String> getMap() {
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,6 +78,8 @@ public class UserBeanProtoDynEncoder extends ProtobufDynEncoder<UserBean> {
|
|||||||
out.writeFieldBytesValue(23, value.getBit6());
|
out.writeFieldBytesValue(23, value.getBit6());
|
||||||
|
|
||||||
out.writeFieldValue(100, value.kind);
|
out.writeFieldValue(100, value.kind);
|
||||||
|
out.writeFieldValue(101, value.count);
|
||||||
|
out.writeFieldValue(102, value.count2);
|
||||||
|
|
||||||
out.writeObjectField(mapEnMember, value);
|
out.writeObjectField(mapEnMember, value);
|
||||||
out.writeObjectE(value);
|
out.writeObjectE(value);
|
||||||
|
|||||||
Reference in New Issue
Block a user