protobuf
This commit is contained in:
@@ -595,7 +595,7 @@ public final class ApiDocCommand {
|
||||
if (col != null) {
|
||||
desc = col.comment();
|
||||
if (!col.nullable()) {
|
||||
requireds.add(member.getAttribute().field());
|
||||
requireds.add(member.getFieldName());
|
||||
}
|
||||
}
|
||||
if (desc.isEmpty() && member.getField().getAnnotation(Comment.class) != null) {
|
||||
@@ -613,7 +613,7 @@ public final class ApiDocCommand {
|
||||
if (col != null) {
|
||||
desc = col.comment();
|
||||
if (!col.nullable()) {
|
||||
requireds.add(member.getAttribute().field());
|
||||
requireds.add(member.getFieldName());
|
||||
}
|
||||
}
|
||||
if (desc.isEmpty() && member.getMethod().getAnnotation(Comment.class) != null) {
|
||||
@@ -630,7 +630,7 @@ public final class ApiDocCommand {
|
||||
if (!desc.isEmpty()) {
|
||||
schemaMap.put("description", desc);
|
||||
}
|
||||
properties.put(member.getAttribute().field(), schemaMap);
|
||||
properties.put(member.getFieldName(), schemaMap);
|
||||
}
|
||||
}
|
||||
if (!requireds.isEmpty()) {
|
||||
@@ -899,7 +899,7 @@ public final class ApiDocCommand {
|
||||
if (index > 0) {
|
||||
json.append(",");
|
||||
}
|
||||
json.append('"').append(member.getAttribute().field()).append("\":{}");
|
||||
json.append('"').append(member.getFieldName()).append("\":{}");
|
||||
index++;
|
||||
}
|
||||
json.append("}");
|
||||
|
||||
@@ -119,6 +119,10 @@ public final class DeMember<R extends Reader, T, F> {
|
||||
return ((TagDecodeable<R, F>) decoder).convertFrom(in, this);
|
||||
}
|
||||
|
||||
public String getFieldName() {
|
||||
return this.attribute.field();
|
||||
}
|
||||
|
||||
public Attribute<T, F> getAttribute() {
|
||||
return this.attribute;
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@ public class DeMemberInfo {
|
||||
this.memberFieldMap = new HashMap<>(deMembers.length);
|
||||
this.memberTagMap = new HashMap<>(deMembers.length);
|
||||
for (DeMember member : deMembers) {
|
||||
this.memberFieldMap.put(member.getAttribute().field(), member);
|
||||
this.memberFieldMap.put(member.getFieldName(), member);
|
||||
this.memberTagMap.put(member.getTag(), member);
|
||||
}
|
||||
this.memberNode = DeMemberNode.create(deMembers);
|
||||
|
||||
@@ -137,6 +137,10 @@ public final class EnMember<W extends Writer, T, F> {
|
||||
return attribute.field().equals(name);
|
||||
}
|
||||
|
||||
public String getFieldName() {
|
||||
return this.attribute.field();
|
||||
}
|
||||
|
||||
public Attribute<T, F> getAttribute() {
|
||||
return attribute;
|
||||
}
|
||||
|
||||
@@ -359,13 +359,12 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
|
||||
@Override
|
||||
public T convertFrom(final R in) {
|
||||
this.checkInited();
|
||||
R objin = objectReader(in);
|
||||
final String clazz = objin.readObjectB(typeClass);
|
||||
final String clazz = in.readObjectB(typeClass);
|
||||
if (clazz == null) {
|
||||
return null;
|
||||
}
|
||||
if (!clazz.isEmpty()) {
|
||||
return (T) factory.loadDecoder(factory.getEntityAlias(clazz)).convertFrom(objin);
|
||||
return (T) factory.loadDecoder(factory.getEntityAlias(clazz)).convertFrom(in);
|
||||
}
|
||||
if (this.creator == null) {
|
||||
if (typeClass.isInterface() || Modifier.isAbstract(typeClass.getModifiers())) {
|
||||
@@ -378,18 +377,17 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
|
||||
if (this.creatorConstructorMembers == null) { // 空构造函数
|
||||
final T result = this.creator == null ? null : this.creator.create();
|
||||
boolean first = true;
|
||||
while (objin.hasNext()) {
|
||||
DeMember member = objin.readFieldName(info);
|
||||
objin.readBlank();
|
||||
while (in.hasNext()) {
|
||||
DeMember member = in.readFieldName(info);
|
||||
in.readBlank();
|
||||
if (member == null) {
|
||||
objin.skipValue(); // 跳过不存在的属性的值
|
||||
in.skipValue(); // 跳过不存在的属性的值
|
||||
} else {
|
||||
readDeMemberValue(objin, member, result, first);
|
||||
readDeMemberValue(in, member, result, first);
|
||||
}
|
||||
first = false;
|
||||
}
|
||||
objin.readObjectE(typeClass);
|
||||
offerReader(in, objin);
|
||||
in.readObjectE(typeClass);
|
||||
return result;
|
||||
} else { // 带参数的构造函数
|
||||
final DeMember<R, T, ?>[] constructorFields = this.creatorConstructorMembers;
|
||||
@@ -397,13 +395,13 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
|
||||
final Object[][] otherParams = new Object[info.length()][2];
|
||||
int oc = 0;
|
||||
boolean first = true;
|
||||
while (objin.hasNext()) {
|
||||
DeMember member = objin.readFieldName(info);
|
||||
objin.readBlank();
|
||||
while (in.hasNext()) {
|
||||
DeMember member = in.readFieldName(info);
|
||||
in.readBlank();
|
||||
if (member == null) {
|
||||
objin.skipValue(); // 跳过不存在的属性的值
|
||||
in.skipValue(); // 跳过不存在的属性的值
|
||||
} else {
|
||||
Object val = readDeMemberValue(objin, member, first);
|
||||
Object val = readDeMemberValue(in, member, first);
|
||||
boolean flag = true;
|
||||
for (int i = 0; i < constructorFields.length; i++) {
|
||||
if (member == constructorFields[i]) {
|
||||
@@ -418,8 +416,7 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
|
||||
}
|
||||
first = false;
|
||||
}
|
||||
objin.readObjectE(typeClass);
|
||||
offerReader(in, objin);
|
||||
in.readObjectE(typeClass);
|
||||
if (this.creator == null) {
|
||||
return null;
|
||||
}
|
||||
@@ -440,18 +437,6 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
|
||||
// do nothing
|
||||
}
|
||||
|
||||
protected boolean hasNext(R in, boolean first) {
|
||||
return in.hasNext();
|
||||
}
|
||||
|
||||
protected R objectReader(R in) {
|
||||
return in;
|
||||
}
|
||||
|
||||
protected void offerReader(R parent, R out) {
|
||||
// do nothing
|
||||
}
|
||||
|
||||
protected Object readDeMemberValue(R in, DeMember member, boolean first) {
|
||||
return member.read(in);
|
||||
}
|
||||
|
||||
@@ -7,9 +7,9 @@ package org.redkale.convert.bson;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import org.redkale.convert.*;
|
||||
import static org.redkale.convert.Reader.SIGN_NULL;
|
||||
import org.redkale.convert.ext.ByteSimpledCoder;
|
||||
import org.redkale.util.*;
|
||||
import static org.redkale.convert.Reader.SIGN_NULL;
|
||||
|
||||
/**
|
||||
* BSON数据源
|
||||
@@ -129,7 +129,6 @@ public class BsonReader extends Reader {
|
||||
break;
|
||||
default:
|
||||
Decodeable decoder = BsonFactory.typeEnum(val);
|
||||
System.out.println("val = " + val + ", decoder = " + decoder);
|
||||
if (decoder != null) {
|
||||
decoder.convertFrom(this);
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ public class JsonMultiImplDecoder<T> implements Decodeable<JsonReader, T> {
|
||||
max = decoder.getMembers().length;
|
||||
}
|
||||
for (DeMember member : decoder.getMembers()) {
|
||||
String name = member.getAttribute().field();
|
||||
String name = member.getFieldName();
|
||||
this.repeatFieldToDecoders.put(name, decoder);
|
||||
fields[i].add(name);
|
||||
Attribute t = fieldTypes.get(name);
|
||||
@@ -164,7 +164,7 @@ public class JsonMultiImplDecoder<T> implements Decodeable<JsonReader, T> {
|
||||
for (int j = 0; j < params.length; j++) {
|
||||
if (params[j] != null
|
||||
&& params[j][0] != null
|
||||
&& constructorFields[i].getAttribute().field().equals(((Attribute) params[j][0]).field())) {
|
||||
&& constructorFields[i].getFieldName().equals(((Attribute) params[j][0]).field())) {
|
||||
constructorParams[i] = params[j][1];
|
||||
params[j] = null;
|
||||
break;
|
||||
|
||||
@@ -44,7 +44,7 @@ public class JsonReader extends Reader {
|
||||
public JsonReader(char[] text, int start, int len) {
|
||||
this.text = Objects.requireNonNull(text);
|
||||
this.position = start - 1;
|
||||
this.limit = start + len - 1;
|
||||
this.limit = this.position + len;
|
||||
}
|
||||
|
||||
public final JsonReader setText(String text) {
|
||||
@@ -58,7 +58,7 @@ public class JsonReader extends Reader {
|
||||
public final JsonReader setText(char[] text, int start, int len) {
|
||||
this.text = text;
|
||||
this.position = start - 1;
|
||||
this.limit = start + len - 1;
|
||||
this.limit = this.position + len;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
@@ -27,26 +27,25 @@ public class ProtobufArrayDecoder<T> extends ArrayDecoder<ProtobufReader, T> {
|
||||
@Override
|
||||
public T[] convertFrom(ProtobufReader in, DeMember member) {
|
||||
this.checkInited();
|
||||
final boolean simpled = this.componentSimpled;
|
||||
final Decodeable<ProtobufReader, T> itemDecoder = this.componentDecoder;
|
||||
in.readArrayB(member, itemDecoder);
|
||||
int contentLength = in.readMemberContentLength(member, itemDecoder);
|
||||
final List<T> result = new ArrayList();
|
||||
boolean first = true;
|
||||
int startPosition = in.position();
|
||||
while (in.hasNext(startPosition, contentLength)) {
|
||||
ProtobufReader itemReader = getItemReader(in, member, first);
|
||||
if (itemReader == null) { // 元素读取完毕
|
||||
final int limit = in.limit();
|
||||
while (in.hasNext()) {
|
||||
ProtobufReader subin = in;
|
||||
if (!simpled) {
|
||||
int contentLen = in.readRawVarint32();
|
||||
in.limit(in.position() + contentLen + 1);
|
||||
}
|
||||
result.add(itemDecoder.convertFrom(subin));
|
||||
in.limit(limit);
|
||||
if (!in.readNextTag(member)) { // 元素结束
|
||||
break;
|
||||
}
|
||||
result.add(itemDecoder.convertFrom(itemReader));
|
||||
first = false;
|
||||
}
|
||||
in.readArrayE();
|
||||
T[] rs = this.componentArrayFunction.apply(result.size());
|
||||
return result.toArray(rs);
|
||||
}
|
||||
|
||||
protected ProtobufReader getItemReader(ProtobufReader in, DeMember member, boolean first) {
|
||||
return ProtobufFactory.getItemReader(in, member, componentSimpled, first);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,25 +25,23 @@ public class ProtobufCollectionDecoder<T> extends CollectionDecoder<ProtobufRead
|
||||
@Override
|
||||
public Collection<T> convertFrom(ProtobufReader in, DeMember member) {
|
||||
this.checkInited();
|
||||
final boolean simpled = !this.componentSimpled;
|
||||
final Decodeable<ProtobufReader, T> itemDecoder = this.componentDecoder;
|
||||
in.readArrayB(member, itemDecoder);
|
||||
int contentLength = in.readMemberContentLength(member, itemDecoder);
|
||||
final Collection<T> result = this.creator.create();
|
||||
boolean first = true;
|
||||
int startPosition = in.position();
|
||||
while (in.hasNext(startPosition, contentLength)) {
|
||||
ProtobufReader itemReader = getItemReader(in, member, first);
|
||||
if (itemReader == null) { // 元素读取完毕
|
||||
final int limit = in.limit();
|
||||
while (in.hasNext()) {
|
||||
if (!simpled) {
|
||||
int contentLen = in.readRawVarint32();
|
||||
in.limit(in.position() + contentLen + 1);
|
||||
}
|
||||
result.add(itemDecoder.convertFrom(in));
|
||||
in.limit(limit);
|
||||
if (!in.readNextTag(member)) { // 元素结束
|
||||
break;
|
||||
}
|
||||
result.add(itemDecoder.convertFrom(itemReader));
|
||||
first = false;
|
||||
}
|
||||
in.readArrayE();
|
||||
return result;
|
||||
}
|
||||
|
||||
protected ProtobufReader getItemReader(ProtobufReader in, DeMember member, boolean first) {
|
||||
return ProtobufFactory.getItemReader(in, member, componentSimpled, first);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -240,7 +240,7 @@ public class ProtobufConvert extends BinaryConvert<ProtobufReader, ProtobufWrite
|
||||
.append(ProtobufFactory.wireTypeString(
|
||||
member.getDecoder().getType(), ((ProtobufFactory) factory).enumtostring))
|
||||
.append(" ")
|
||||
.append(member.getAttribute().field())
|
||||
.append(member.getFieldName())
|
||||
.append("\" : ")
|
||||
.append(member.getPosition())
|
||||
.append(i == members.size() - 1 ? "\r\n" : ",\r\n");
|
||||
@@ -389,7 +389,7 @@ public class ProtobufConvert extends BinaryConvert<ProtobufReader, ProtobufWrite
|
||||
.append(ProtobufFactory.wireTypeString(
|
||||
member.getEncoder().getType(), ((ProtobufFactory) factory).enumtostring))
|
||||
.append(" ")
|
||||
.append(member.getAttribute().field())
|
||||
.append(member.getFieldName())
|
||||
.append("\" : ")
|
||||
.append(member.getPosition())
|
||||
.append(i == members.size() - 1 ? "\r\n" : ",\r\n");
|
||||
@@ -541,7 +541,7 @@ public class ProtobufConvert extends BinaryConvert<ProtobufReader, ProtobufWrite
|
||||
.append(ProtobufFactory.wireTypeString(
|
||||
member.getEncoder().getType(), ((ProtobufFactory) factory).enumtostring))
|
||||
.append(" ")
|
||||
.append(member.getAttribute().field())
|
||||
.append(member.getFieldName())
|
||||
.append(" = ")
|
||||
.append(member.getPosition())
|
||||
.append(member.getComment().isEmpty() ? ";\r\n" : ("; //" + member.getComment() + " \r\n"));
|
||||
|
||||
@@ -8,8 +8,8 @@ import java.lang.reflect.*;
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.atomic.*;
|
||||
import static org.redkale.asm.ClassWriter.COMPUTE_FRAMES;
|
||||
import org.redkale.asm.*;
|
||||
import static org.redkale.asm.ClassWriter.COMPUTE_FRAMES;
|
||||
import static org.redkale.asm.Opcodes.*;
|
||||
import org.redkale.convert.*;
|
||||
import org.redkale.util.*;
|
||||
@@ -54,7 +54,7 @@ public abstract class ProtobufDynEncoder<T> extends ProtobufObjectEncoder<T> {
|
||||
final Map<String, EnMember> otherMembers = new HashMap<>();
|
||||
StringBuilder elementb = new StringBuilder();
|
||||
for (EnMember member : selfObjEncoder.getMembers()) {
|
||||
final String fieldName = member.getAttribute().field();
|
||||
final String fieldName = member.getFieldName();
|
||||
final Class fieldClass = member.getAttribute().type();
|
||||
final Type fieldType = member.getAttribute().genericType();
|
||||
elementb.append(fieldName).append(',');
|
||||
@@ -172,7 +172,7 @@ public abstract class ProtobufDynEncoder<T> extends ProtobufObjectEncoder<T> {
|
||||
mv.visitMethodInsn(INVOKEVIRTUAL, pbwriterName, "writeObjectB", "(Ljava/lang/Object;)V", false);
|
||||
|
||||
for (EnMember member : selfObjEncoder.getMembers()) {
|
||||
final String fieldName = member.getAttribute().field();
|
||||
final String fieldName = member.getFieldName();
|
||||
final Type fieldType = member.getAttribute().genericType();
|
||||
final Class fieldClass = member.getAttribute().type();
|
||||
if (ProtobufFactory.isSimpleType(fieldClass)) {
|
||||
|
||||
@@ -303,44 +303,6 @@ public class ProtobufFactory extends ConvertFactory<ProtobufReader, ProtobufWrit
|
||||
return true;
|
||||
}
|
||||
|
||||
protected static ProtobufReader getItemReader(ProtobufReader in, DeMember member, boolean simpled, boolean first) {
|
||||
if (simpled) {
|
||||
if (member == null || first) {
|
||||
return in;
|
||||
}
|
||||
int tag = in.readTag();
|
||||
if (tag != member.getTag()) { // 元素结束
|
||||
in.backTag(tag);
|
||||
return null;
|
||||
}
|
||||
return in;
|
||||
} else {
|
||||
if (!first && member != null) {
|
||||
int tag = in.readTag();
|
||||
if (tag != member.getTag()) { // 元素结束
|
||||
in.backTag(tag);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
byte[] bs = in.readByteArray();
|
||||
return new ProtobufReader(bs);
|
||||
}
|
||||
}
|
||||
|
||||
protected static boolean isNoLenBytesType(Type type) {
|
||||
return (type instanceof Class && ((Class) type).isPrimitive())
|
||||
|| type == Boolean.class
|
||||
|| type == Byte.class
|
||||
|| type == Short.class
|
||||
|| type == Character.class
|
||||
|| type == Integer.class
|
||||
|| type == Float.class
|
||||
|| type == Long.class
|
||||
|| type == Double.class
|
||||
|| type == AtomicInteger.class
|
||||
|| type == AtomicLong.class;
|
||||
}
|
||||
|
||||
protected static boolean isSimpleType(Class fieldClass) {
|
||||
return fieldClass.isPrimitive()
|
||||
|| fieldClass == Boolean.class
|
||||
@@ -476,23 +438,21 @@ public class ProtobufFactory extends ConvertFactory<ProtobufReader, ProtobufWrit
|
||||
public static int wireType(Type javaType, boolean enumtostring) {
|
||||
if (javaType == double.class || javaType == Double.class) {
|
||||
return 1;
|
||||
}
|
||||
if (javaType == float.class || javaType == Float.class) {
|
||||
} else if (javaType == float.class || javaType == Float.class) {
|
||||
return 5;
|
||||
}
|
||||
if (javaType == boolean.class || javaType == Boolean.class) {
|
||||
} else if ((javaType == boolean.class || javaType == Boolean.class)
|
||||
|| (javaType == byte.class || javaType == Byte.class)
|
||||
|| (javaType == char.class || javaType == Character.class)
|
||||
|| (javaType == short.class || javaType == Short.class)
|
||||
|| (javaType == int.class || javaType == Integer.class)
|
||||
|| (javaType == long.class || javaType == Long.class)
|
||||
|| (javaType == AtomicInteger.class || javaType == AtomicLong.class)) {
|
||||
return 0;
|
||||
} else if (!enumtostring && (javaType instanceof Class) && ((Class) javaType).isEnum()) {
|
||||
return 0;
|
||||
} else { // byte[]
|
||||
return 2;
|
||||
}
|
||||
if (javaType instanceof Class) {
|
||||
Class javaClazz = (Class) javaType;
|
||||
if (javaClazz.isEnum()) {
|
||||
return enumtostring ? 2 : 0;
|
||||
}
|
||||
if (javaClazz.isPrimitive() || Number.class.isAssignableFrom(javaClazz)) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 2;
|
||||
}
|
||||
|
||||
public static String wireTypeString(Type javaType, boolean enumtostring) {
|
||||
|
||||
@@ -28,34 +28,23 @@ public class ProtobufMapDecoder<K, V> extends MapDecoder<ProtobufReader, K, V> {
|
||||
this.checkInited();
|
||||
in.readMapB(member, this.keyDecoder, this.valueDecoder);
|
||||
final Map<K, V> result = this.creator.create();
|
||||
boolean first = true;
|
||||
Decodeable<ProtobufReader, K> kdecoder = this.keyDecoder;
|
||||
Decodeable<ProtobufReader, V> vdecoder = this.valueDecoder;
|
||||
final int limit = in.limit();
|
||||
while (in.hasNext()) {
|
||||
ProtobufReader entryReader = getEntryReader(in, member, first);
|
||||
if (entryReader == null) {
|
||||
int contentLen = in.readRawVarint32();
|
||||
in.limit(in.position() + contentLen + 1);
|
||||
in.readTag();
|
||||
K key = kdecoder.convertFrom(in);
|
||||
in.readTag();
|
||||
V value = vdecoder.convertFrom(in);
|
||||
result.put(key, value);
|
||||
in.limit(limit);
|
||||
if (!in.readNextTag(member)) { // 元素结束
|
||||
break;
|
||||
}
|
||||
entryReader.readTag();
|
||||
K key = kdecoder.convertFrom(entryReader);
|
||||
entryReader.readTag();
|
||||
V value = vdecoder.convertFrom(entryReader);
|
||||
result.put(key, value);
|
||||
first = false;
|
||||
}
|
||||
in.readMapE();
|
||||
return result;
|
||||
}
|
||||
|
||||
protected ProtobufReader getEntryReader(ProtobufReader in, DeMember member, boolean first) {
|
||||
if (!first && member != null) {
|
||||
int tag = in.readTag();
|
||||
if (tag != member.getTag()) {
|
||||
in.backTag(tag);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
byte[] bs = in.readByteArray();
|
||||
return new ProtobufReader(bs);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,12 +13,27 @@ import org.redkale.util.*;
|
||||
* @author zhangjx
|
||||
* @param <T> T
|
||||
*/
|
||||
public class ProtobufObjectDecoder<T> extends ObjectDecoder<ProtobufReader, T> {
|
||||
public class ProtobufObjectDecoder<T> extends ObjectDecoder<ProtobufReader, T>
|
||||
implements TagDecodeable<ProtobufReader, T> {
|
||||
|
||||
protected ProtobufObjectDecoder(Type type) {
|
||||
super(type);
|
||||
}
|
||||
|
||||
@Override
|
||||
public T convertFrom(ProtobufReader in, DeMember member) {
|
||||
if (member == null) {
|
||||
return super.convertFrom(in);
|
||||
} else {
|
||||
final int limit = in.limit();
|
||||
int contentLen = in.readRawVarint32();
|
||||
in.limit(in.position() + contentLen + 1);
|
||||
T result = super.convertFrom(in);
|
||||
in.limit(limit);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initForEachDeMember(ConvertFactory factory, DeMember member) {
|
||||
if (member.getIndex() < 1) {
|
||||
@@ -30,19 +45,6 @@ public class ProtobufObjectDecoder<T> extends ObjectDecoder<ProtobufReader, T> {
|
||||
setTag(member, ProtobufFactory.getTag(attr.field(), attr.genericType(), member.getPosition(), enumtostring));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ProtobufReader objectReader(ProtobufReader in) {
|
||||
if (in.position() > in.initoffset) {
|
||||
return new ProtobufReader(in.readByteArray());
|
||||
}
|
||||
return in;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean hasNext(ProtobufReader in, boolean first) {
|
||||
return in.hasNext();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Object readDeMemberValue(ProtobufReader in, DeMember member, boolean first) {
|
||||
Decodeable decoder = member.getDecoder();
|
||||
@@ -62,4 +64,5 @@ public class ProtobufObjectDecoder<T> extends ObjectDecoder<ProtobufReader, T> {
|
||||
member.read(in, result);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -16,9 +16,11 @@ public class ProtobufReader extends Reader {
|
||||
|
||||
protected int position = -1;
|
||||
|
||||
protected int initoffset;
|
||||
protected byte[] content;
|
||||
|
||||
private byte[] content;
|
||||
//protected int initoffset;
|
||||
|
||||
protected int limit;
|
||||
|
||||
protected int cacheTag = Integer.MIN_VALUE;
|
||||
|
||||
@@ -49,7 +51,8 @@ public class ProtobufReader extends Reader {
|
||||
public final void setBytes(byte[] bytes) {
|
||||
if (bytes == null) {
|
||||
this.position = 0;
|
||||
this.initoffset = 0;
|
||||
//this.initoffset = 0;
|
||||
this.limit = 0;
|
||||
} else {
|
||||
setBytes(bytes, 0, bytes.length);
|
||||
}
|
||||
@@ -58,17 +61,28 @@ public class ProtobufReader extends Reader {
|
||||
public final void setBytes(byte[] bytes, int start, int len) {
|
||||
if (bytes == null) {
|
||||
this.position = 0;
|
||||
this.initoffset = 0;
|
||||
//this.initoffset = 0;
|
||||
this.limit = 0;
|
||||
} else {
|
||||
this.content = bytes;
|
||||
this.position = start - 1;
|
||||
this.initoffset = this.position;
|
||||
this.limit = start + len;
|
||||
//this.initoffset = this.position;
|
||||
}
|
||||
}
|
||||
|
||||
public void limit(int limit) {
|
||||
this.limit = limit;
|
||||
}
|
||||
|
||||
public int limit() {
|
||||
return this.limit;
|
||||
}
|
||||
|
||||
protected boolean recycle() {
|
||||
this.position = -1;
|
||||
this.initoffset = -1;
|
||||
this.limit = -1;
|
||||
//this.initoffset = -1;
|
||||
this.content = null;
|
||||
return true;
|
||||
}
|
||||
@@ -78,11 +92,12 @@ public class ProtobufReader extends Reader {
|
||||
return this;
|
||||
}
|
||||
|
||||
// 通常用于尾部解析
|
||||
public byte[] remainBytes() {
|
||||
if (this.position >= this.content.length) {
|
||||
if (this.position >= this.limit) {
|
||||
return new byte[0];
|
||||
}
|
||||
return Arrays.copyOfRange(this.content, this.position + 1, this.content.length);
|
||||
return Arrays.copyOfRange(this.content, this.position + 1, this.limit);
|
||||
}
|
||||
|
||||
/** 跳过属性的值 */
|
||||
@@ -113,7 +128,7 @@ public class ProtobufReader extends Reader {
|
||||
|
||||
@Override
|
||||
public final String readObjectB(final Class clazz) {
|
||||
return (this.position + 1) < this.content.length ? "" : null;
|
||||
return (this.position + 1) < this.limit ? "" : null;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -159,13 +174,6 @@ public class ProtobufReader extends Reader {
|
||||
return this.position;
|
||||
}
|
||||
|
||||
public final int readMemberContentLength(DeMember member, Decodeable decoder) {
|
||||
if (member == null && decoder == null) {
|
||||
return -1; // 为byte[]
|
||||
}
|
||||
return member != null ? -1 : readRawVarint32(); // readUInt32
|
||||
}
|
||||
|
||||
@Override
|
||||
public final DeMember readFieldName(final DeMemberInfo memberInfo) {
|
||||
int tag = readTag();
|
||||
@@ -452,6 +460,18 @@ public class ProtobufReader extends Reader {
|
||||
return val;
|
||||
}
|
||||
|
||||
public boolean readNextTag(DeMember member) {
|
||||
if (!hasNext()) {
|
||||
return false;
|
||||
}
|
||||
int tag = readTag();
|
||||
if (tag != member.getTag()) { // 元素结束
|
||||
backTag(tag);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
protected final int readTag() {
|
||||
if (cacheTag != Integer.MIN_VALUE) {
|
||||
int tag = cacheTag;
|
||||
@@ -471,22 +491,7 @@ public class ProtobufReader extends Reader {
|
||||
|
||||
@Override
|
||||
public boolean hasNext() {
|
||||
return (this.position + 1) < this.content.length;
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断对象是否存在下一个属性或者数组是否存在下一个元素
|
||||
*
|
||||
* @param startPosition 起始位置
|
||||
* @param contentLength 内容大小, 不确定的传-1
|
||||
* @return 是否存在
|
||||
*/
|
||||
public boolean hasNext(int startPosition, int contentLength) {
|
||||
// ("-------------: " + startPosition + ", " + contentLength + ", " + this.position);
|
||||
if (startPosition >= 0 && contentLength >= 0) {
|
||||
return (this.position) < (startPosition + contentLength);
|
||||
}
|
||||
return (this.position + 1) < this.content.length;
|
||||
return (this.position + 1) < this.limit;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -503,7 +508,7 @@ public class ProtobufReader extends Reader {
|
||||
fastpath:
|
||||
{
|
||||
int curr = this.position;
|
||||
if ((curr + 1) == data.length) {
|
||||
if ((curr + 1) == limit) {
|
||||
break fastpath;
|
||||
}
|
||||
|
||||
@@ -511,7 +516,7 @@ public class ProtobufReader extends Reader {
|
||||
if ((x = data[++curr]) >= 0) {
|
||||
this.position = curr;
|
||||
return x;
|
||||
} else if (data.length - (curr + 1) < 9) {
|
||||
} else if (limit - (curr + 1) < 9) {
|
||||
break fastpath;
|
||||
} else if ((x ^= (data[++curr] << 7)) < 0) {
|
||||
x ^= (~0 << 7);
|
||||
@@ -543,7 +548,7 @@ public class ProtobufReader extends Reader {
|
||||
fastpath:
|
||||
{
|
||||
int curr = this.position;
|
||||
if ((curr + 1) == data.length) {
|
||||
if ((curr + 1) == this.limit) {
|
||||
break fastpath;
|
||||
}
|
||||
|
||||
@@ -552,7 +557,7 @@ public class ProtobufReader extends Reader {
|
||||
if ((y = data[++curr]) >= 0) {
|
||||
this.position = curr;
|
||||
return y;
|
||||
} else if (data.length - (curr + 1) < 9) {
|
||||
} else if (this.limit - (curr + 1) < 9) {
|
||||
break fastpath;
|
||||
} else if ((y ^= (data[++curr] << 7)) < 0) {
|
||||
x = y ^ (~0 << 7);
|
||||
|
||||
@@ -26,25 +26,23 @@ public class ProtobufStreamDecoder<T> extends StreamDecoder<ProtobufReader, T> {
|
||||
@Override
|
||||
public Stream<T> convertFrom(ProtobufReader in, DeMember member) {
|
||||
this.checkInited();
|
||||
final boolean simpled = !this.componentSimpled;
|
||||
final Decodeable<ProtobufReader, T> itemDecoder = this.componentDecoder;
|
||||
in.readArrayB(member, itemDecoder);
|
||||
int contentLength = in.readMemberContentLength(member, itemDecoder);
|
||||
final List<T> result = new ArrayList();
|
||||
boolean first = true;
|
||||
int startPosition = in.position();
|
||||
while (in.hasNext(startPosition, contentLength)) {
|
||||
ProtobufReader itemReader = getItemReader(in, member, first);
|
||||
if (itemReader == null) { // 元素读取完毕
|
||||
final int limit = in.limit();
|
||||
while (in.hasNext()) {
|
||||
if (!simpled) {
|
||||
int contentLen = in.readRawVarint32();
|
||||
in.limit(in.position() + contentLen + 1);
|
||||
}
|
||||
result.add(itemDecoder.convertFrom(in));
|
||||
in.limit(limit);
|
||||
if (!in.readNextTag(member)) { // 元素结束
|
||||
break;
|
||||
}
|
||||
result.add(itemDecoder.convertFrom(itemReader));
|
||||
first = false;
|
||||
}
|
||||
in.readArrayE();
|
||||
return result.stream();
|
||||
}
|
||||
|
||||
protected ProtobufReader getItemReader(ProtobufReader in, DeMember member, boolean first) {
|
||||
return ProtobufFactory.getItemReader(in, member, componentSimpled, first);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3562,6 +3562,18 @@ public final class Utility {
|
||||
* @param bytes 字节数组
|
||||
*/
|
||||
public static void println(String string, byte... bytes) {
|
||||
println(string, bytes, 0, bytes.length);
|
||||
}
|
||||
|
||||
/**
|
||||
* 将字节数组的内容转换成字符串并打印到控制台, string参数不为空时会追加在字节数组内容字符串之前
|
||||
*
|
||||
* @param string 字符串前缀
|
||||
* @param bytes 字节数组
|
||||
* @param start 起始位置
|
||||
* @param len 长度
|
||||
*/
|
||||
public static void println(String string, byte[] bytes, int start, int len) {
|
||||
if (bytes == null) {
|
||||
return;
|
||||
}
|
||||
@@ -3569,9 +3581,10 @@ public final class Utility {
|
||||
if (string != null) {
|
||||
sb.append(string);
|
||||
}
|
||||
sb.append(bytes.length).append(".[");
|
||||
sb.append(len).append(".[");
|
||||
boolean last = false;
|
||||
for (byte b : bytes) {
|
||||
for (int i = 0; i < len; i++) {
|
||||
byte b = bytes[start + i];
|
||||
if (last) {
|
||||
sb.append(',');
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user