convert优化

This commit is contained in:
redkale
2024-09-27 18:07:16 +08:00
parent 438ce904ab
commit 84177f43f4
36 changed files with 432 additions and 532 deletions

View File

@@ -91,34 +91,22 @@ public class ArrayDecoder<R extends Reader, T> implements TagDecodeable<R, T[]>
return convertFrom(in, null);
}
@Override
public T[] convertFrom(R in, DeMember member) {
this.checkInited();
byte[] typevals = new byte[1];
int len = in.readArrayB(member, typevals, componentDecoder);
int contentLength = -1;
final Decodeable<R, T> itemDecoder = this.componentDecoder;
int len = in.readArrayB(member, itemDecoder);
if (len == Reader.SIGN_NULL) {
return null;
}
if (len == Reader.SIGN_NOLENBUTBYTES) {
contentLength = in.readMemberContentLength(member, componentDecoder);
len = Reader.SIGN_NOLENGTH;
}
final Decodeable<R, T> localDecoder = getComponentDecoder(this.componentDecoder, typevals);
final List<T> result = new ArrayList();
boolean first = true;
if (len == Reader.SIGN_NOLENGTH) {
int startPosition = in.position();
while (hasNext(in, member, startPosition, contentLength, first)) {
R itemReader = getItemReader(in, member, first);
if (itemReader == null) { // 元素读取完毕
break;
}
result.add(readMemberValue(itemReader, member, localDecoder, first));
first = false;
if (len == Reader.SIGN_VARIABLE) {
while (in.hasNext()) {
result.add(itemDecoder.convertFrom(in));
}
} else {
} else { // 固定长度
for (int i = 0; i < len; i++) {
result.add(localDecoder.convertFrom(in));
result.add(itemDecoder.convertFrom(in));
}
}
in.readArrayE();
@@ -126,25 +114,6 @@ public class ArrayDecoder<R extends Reader, T> implements TagDecodeable<R, T[]>
return result.toArray(rs);
}
protected boolean hasNext(R in, DeMember member, int startPosition, int contentLength, boolean first) {
return in.hasNext(startPosition, contentLength);
}
protected Decodeable<R, T> getComponentDecoder(Decodeable<R, T> decoder, byte[] typevals) {
return decoder;
}
protected R getItemReader(R in, DeMember member, boolean first) {
return in;
}
protected T readMemberValue(R in, DeMember member, Decodeable<R, T> decoder, boolean first) {
if (in == null) {
return null;
}
return decoder.convertFrom(in);
}
@Override
public String toString() {
return this.getClass().getSimpleName() + "{componentType:" + this.componentType + ", decoder:"

View File

@@ -98,57 +98,25 @@ public class CollectionDecoder<R extends Reader, T> implements TagDecodeable<R,
public Collection<T> convertFrom(R in, DeMember member) {
this.checkInited();
byte[] typevals = new byte[1];
int len = in.readArrayB(member, typevals, componentDecoder);
int contentLength = -1;
if (len == Reader.SIGN_NULL) {
final Decodeable<R, T> itemDecoder = this.componentDecoder;
int size = in.readArrayB(member, itemDecoder);
if (size == Reader.SIGN_NULL) {
return null;
}
if (len == Reader.SIGN_NOLENBUTBYTES) {
contentLength = in.readMemberContentLength(member, componentDecoder);
len = Reader.SIGN_NOLENGTH;
}
final Decodeable<R, T> localDecoder = getComponentDecoder(this.componentDecoder, typevals);
final Collection<T> result = this.creator.create();
boolean first = true;
if (len == Reader.SIGN_NOLENGTH) {
int startPosition = in.position();
while (hasNext(in, member, startPosition, contentLength, first)) {
R itemReader = getItemReader(in, member, first);
if (itemReader == null) { // 元素读取完毕
break;
}
result.add(readMemberValue(itemReader, member, localDecoder, first));
first = false;
if (size == Reader.SIGN_VARIABLE) {
while (in.hasNext()) {
result.add(itemDecoder.convertFrom(in));
}
} else {
for (int i = 0; i < len; i++) {
result.add(localDecoder.convertFrom(in));
} else { // 固定长度
for (int i = 0; i < size; i++) {
result.add(itemDecoder.convertFrom(in));
}
}
in.readArrayE();
return result;
}
protected boolean hasNext(R in, DeMember member, int startPosition, int contentLength, boolean first) {
return in.hasNext(startPosition, contentLength);
}
protected Decodeable<R, T> getComponentDecoder(Decodeable<R, T> decoder, byte[] typevals) {
return decoder;
}
protected R getItemReader(R in, DeMember member, boolean first) {
return in;
}
protected T readMemberValue(R in, DeMember member, Decodeable<R, T> decoder, boolean first) {
if (in == null) {
return null;
}
return decoder.convertFrom(in);
}
@Override
public Type getType() {
return type;

View File

@@ -121,70 +121,32 @@ public class MapDecoder<R extends Reader, K, V> implements TagDecodeable<R, Map<
@Override
public Map<K, V> convertFrom(R in, DeMember member) {
this.checkInited();
byte[] typevals = new byte[2];
int len = in.readMapB(member, typevals, this.keyDecoder, this.valueDecoder);
int contentLength = -1;
Decodeable<R, K> kdecoder = this.keyDecoder;
Decodeable<R, V> vdecoder = this.valueDecoder;
int len = in.readMapB(member, kdecoder, vdecoder);
if (len == Reader.SIGN_NULL) {
return null;
}
if (len == Reader.SIGN_NOLENBUTBYTES) {
contentLength = in.readMemberContentLength(member, null);
len = Reader.SIGN_NOLENGTH;
}
final Map<K, V> result = this.creator.create();
boolean first = true;
Decodeable<R, K> kdecoder = getKeyDecoder(this.keyDecoder, typevals);
Decodeable<R, V> vdecoder = getValueDecoder(this.valueDecoder, typevals);
if (len == Reader.SIGN_NOLENGTH) {
int startPosition = in.position();
while (hasNext(in, member, startPosition, contentLength, first)) {
R entryReader = getEntryReader(in, member, first);
if (entryReader == null) {
break;
}
K key = readKeyMember(entryReader, member, kdecoder, first);
entryReader.readBlank();
V value = readValueMember(entryReader, member, vdecoder, first);
result.put(key, value);
first = false;
}
} else {
for (int i = 0; i < len; i++) {
K key = readKeyMember(in, member, kdecoder, first);
if (len == Reader.SIGN_VARIABLE) {
while (in.hasNext()) {
K key = kdecoder.convertFrom(in);
in.readBlank();
V value = readValueMember(in, member, vdecoder, first);
V value = vdecoder.convertFrom(in);
result.put(key, value);
}
} else { // 固定长度
for (int i = 0; i < len; i++) {
K key = kdecoder.convertFrom(in);
in.readBlank();
V value = vdecoder.convertFrom(in);
result.put(key, value);
first = false;
}
}
in.readMapE();
return result;
}
protected boolean hasNext(R in, DeMember member, int startPosition, int contentLength, boolean first) {
return in.hasNext(startPosition, contentLength);
}
protected Decodeable<R, K> getKeyDecoder(Decodeable<R, K> decoder, byte[] typevals) {
return decoder;
}
protected Decodeable<R, V> getValueDecoder(Decodeable<R, V> decoder, byte[] typevals) {
return decoder;
}
protected R getEntryReader(R in, DeMember member, boolean first) {
return in;
}
protected K readKeyMember(R in, DeMember member, Decodeable<R, K> decoder, boolean first) {
return decoder.convertFrom(in);
}
protected V readValueMember(R in, DeMember member, Decodeable<R, V> decoder, boolean first) {
return decoder.convertFrom(in);
}
@Override
public Type getType() {
return this.type;

View File

@@ -349,16 +349,15 @@ public class ObjectEncoder<W extends Writer, T> implements Encodeable<W, T> {
if (extFields != null) {
Encodeable<W, ?> anyEncoder = factory.getAnyEncoder();
for (ConvertField en : extFields) {
if (en == null) {
continue;
if (en != null) {
maxPosition++;
objout.writeObjectField(
en.getName(),
en.getType(),
Math.max(en.getPosition(), maxPosition),
anyEncoder,
en.getValue());
}
maxPosition++;
objout.writeObjectField(
en.getName(),
en.getType(),
Math.max(en.getPosition(), maxPosition),
anyEncoder,
en.getValue());
}
}
}

View File

@@ -20,12 +20,19 @@ public abstract class Reader {
MAP;
}
/**
* 集合对象为null
*
* @see #readArrayB(org.redkale.convert.DeMember, org.redkale.convert.Decodeable)
*/
public static final short SIGN_NULL = -1;
public static final short SIGN_NOLENGTH = -2;
// 目前只适合于protobuf的boolean[]...double[]类型
public static final short SIGN_NOLENBUTBYTES = -3;
/**
* 不确定的长度, 比如解析json数组
*
* @see #readArrayB(org.redkale.convert.DeMember, org.redkale.convert.Decodeable)
*/
public static final short SIGN_VARIABLE = -2;
/**
* 设置Reader的内容通常结合对象池使用
@@ -34,24 +41,12 @@ public abstract class Reader {
*/
public abstract void prepare(byte[] content);
/**
* 是否还存在下个元素或字段 <br>
* 注意: 主要用于Array、Collection、Stream或Map等集合对象
*
* @param startPosition 起始位置
* @param contentLength 内容大小, 不确定的传-1
* @return 是否还存在下个元素或字段
*/
public abstract boolean hasNext(int startPosition, int contentLength);
/**
* 是否还存在下个元素或字段
*
* @return 是否还存在下个元素或字段
*/
public boolean hasNext() {
return hasNext(-1, -1);
}
public abstract boolean hasNext();
/**
* 获取当前位置
@@ -60,16 +55,6 @@ public abstract class Reader {
*/
public abstract int position();
/**
* 读取字段值内容的字节数 <br>
* 只有在readXXXB方法返回SIGN_NOLENBUTBYTES值才会调用此方法
*
* @param member DeMember
* @param decoder Decodeable
* @return 内容大小, 不确定返回-1
*/
public abstract int readMemberContentLength(DeMember member, Decodeable decoder);
/** 跳过值(不包含值前面的字段) */
public abstract void skipValue();
@@ -103,12 +88,13 @@ public abstract class Reader {
/**
* 读取数组的开头并返回数组的长度
*
* @see #SIGN_NULL
* @see #SIGN_VARIABLE
* @param member DeMember
* @param typevals byte[]
* @param componentDecoder Decodeable
* @return 返回数组的长度
*/
public abstract int readArrayB(DeMember member, byte[] typevals, Decodeable componentDecoder);
public abstract int readArrayB(DeMember member, Decodeable componentDecoder);
/** 读取数组的尾端 */
public abstract void readArrayE();
@@ -117,12 +103,11 @@ public abstract class Reader {
* 读取map的开头并返回map的size
*
* @param member DeMember
* @param typevals byte[]
* @param keyDecoder Decodeable
* @param valueDecoder Decodeable
* @return 返回map的size
*/
public abstract int readMapB(DeMember member, byte[] typevals, Decodeable keyDecoder, Decodeable valueDecoder);
public abstract int readMapB(DeMember member, Decodeable keyDecoder, Decodeable valueDecoder);
/** 读取数组的尾端 */
public abstract void readMapE();

View File

@@ -79,54 +79,25 @@ public class StreamDecoder<R extends Reader, T> implements TagDecodeable<R, Stre
public Stream<T> convertFrom(R in, DeMember member) {
this.checkInited();
byte[] typevals = new byte[1];
int len = in.readArrayB(member, typevals, this.componentDecoder);
int contentLength = -1;
final Decodeable<R, T> itemDecoder = this.componentDecoder;
int len = in.readArrayB(member, itemDecoder);
if (len == Reader.SIGN_NULL) {
return null;
}
if (len == Reader.SIGN_NOLENBUTBYTES) {
contentLength = in.readMemberContentLength(member, this.componentDecoder);
len = Reader.SIGN_NOLENGTH;
}
final Decodeable<R, T> localDecoder = getComponentDecoder(this.componentDecoder, typevals);
final List<T> result = new ArrayList();
boolean first = true;
if (len == Reader.SIGN_NOLENGTH) {
int startPosition = in.position();
while (hasNext(in, member, startPosition, contentLength, first)) {
R itemReader = getItemReader(in, member, first);
if (itemReader == null) { // 元素读取完毕
break;
}
result.add(readMemberValue(itemReader, member, localDecoder, first));
first = false;
if (len == Reader.SIGN_VARIABLE) {
while (in.hasNext()) {
result.add(itemDecoder.convertFrom(in));
}
} else {
} else { // 固定长度
for (int i = 0; i < len; i++) {
result.add(localDecoder.convertFrom(in));
result.add(itemDecoder.convertFrom(in));
}
}
in.readArrayE();
return result.stream();
}
protected boolean hasNext(R in, DeMember member, int startPosition, int contentLength, boolean first) {
return in.hasNext(startPosition, contentLength);
}
protected Decodeable<R, T> getComponentDecoder(Decodeable<R, T> decoder, byte[] typevals) {
return decoder;
}
protected R getItemReader(R in, DeMember member, boolean first) {
return in;
}
protected T readMemberValue(R in, DeMember member, Decodeable<R, T> decoder, boolean first) {
return decoder.convertFrom(in);
}
@Override
public Type getType() {
return type;

View File

@@ -0,0 +1,46 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.redkale.convert.bson;
import java.lang.reflect.Type;
import java.util.*;
import org.redkale.convert.*;
/**
* 数组的反序列化操作类 <br>
* 对象数组的反序列化不包含int[]、long[]这样的primitive class数组。 <br>
* 支持一定程度的泛型。 <br>
*
* <p>详情见: https://redkale.org
*
* @author zhangjx
* @param <T> 反解析的数组元素类型
*/
public class BsonArrayDecoder<T> extends ArrayDecoder<BsonReader, T> {
public BsonArrayDecoder(final BsonFactory factory, final Type type) {
super(factory, type);
}
@Override
public T[] convertFrom(BsonReader in, DeMember member) {
this.checkInited();
byte[] typevals = new byte[1];
int len = in.readArrayB(member, typevals, this.componentDecoder);
if (len == Reader.SIGN_NULL) {
return null;
}
final Decodeable<BsonReader, T> itemDecoder = BsonFactory.typeEnum(typevals[0]);
final List<T> result = new ArrayList();
// 固定长度
for (int i = 0; i < len; i++) {
result.add(itemDecoder.convertFrom(in));
}
in.readArrayE();
T[] rs = this.componentArrayFunction.apply(result.size());
return result.toArray(rs);
}
}

View File

@@ -5,12 +5,12 @@
*/
package org.redkale.convert.bson;
import static org.redkale.convert.Reader.SIGN_NULL;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import org.redkale.convert.*;
import org.redkale.convert.ext.ByteSimpledCoder;
import static org.redkale.convert.Reader.SIGN_NULL;
/**
* 以ByteBuffer为数据载体的BsonReader

View File

@@ -0,0 +1,44 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.redkale.convert.bson;
import java.lang.reflect.Type;
import java.util.Collection;
import org.redkale.convert.*;
/**
* Collection的反序列化操作类 <br>
* 支持一定程度的泛型。 <br>
*
* <p>详情见: https://redkale.org
*
* @author zhangjx
* @param <T> 反解析的集合元素类型
*/
public class BsonCollectionDecoder<T> extends CollectionDecoder<BsonReader, T> {
public BsonCollectionDecoder(final ConvertFactory factory, final Type type) {
super(factory, type);
}
@Override
public Collection<T> convertFrom(BsonReader in, DeMember member) {
this.checkInited();
byte[] typevals = new byte[1];
int len = in.readArrayB(member, typevals, componentDecoder);
if (len == Reader.SIGN_NULL) {
return null;
}
final Decodeable<BsonReader, T> itemDecoder = BsonFactory.typeEnum(typevals[0]);
final Collection<T> result = this.creator.create();
// 固定长度
for (int i = 0; i < len; i++) {
result.add(itemDecoder.convertFrom(in));
}
in.readArrayE();
return result;
}
}

View File

@@ -36,15 +36,15 @@ public final class BsonFactory extends ConvertFactory<BsonReader, BsonWriter> {
static final Encodeable objectEncoder = instance.loadEncoder(Object.class);
static final Decodeable skipArrayDecoder = new SkipArrayDecoder(instance, Object[].class);
static final Decodeable skipArrayDecoder = new BsonArrayDecoder(instance, Object[].class);
static final Decodeable skipCollectionDecoder =
new SkipCollectionDecoder(instance, new TypeToken<Collection<Object>>() {}.getType());
new BsonCollectionDecoder(instance, new TypeToken<Collection<Object>>() {}.getType());
static final Decodeable skipStreamDecoder =
new SkipStreamDecoder(instance, new TypeToken<Stream<Object>>() {}.getType());
new BsonStreamDecoder(instance, new TypeToken<Stream<Object>>() {}.getType());
static final Decodeable skipMapDecoder = new SkipMapDecoder(instance, Map.class);
static final Decodeable skipMapDecoder = new BsonMapDecoder(instance, Map.class);
static {
instance.register(Serializable.class, objectDecoder);
@@ -120,6 +120,26 @@ public final class BsonFactory extends ConvertFactory<BsonReader, BsonWriter> {
return new BsonFactory(this, features);
}
@Override
protected <E> Decodeable<BsonReader, E> createArrayDecoder(Type type) {
return new BsonArrayDecoder(this, type);
}
@Override
protected <E> Decodeable<BsonReader, E> createCollectionDecoder(Type type) {
return new BsonCollectionDecoder(this, type);
}
@Override
protected <E> Decodeable<BsonReader, E> createStreamDecoder(Type type) {
return new BsonStreamDecoder(this, type);
}
@Override
protected <E> Decodeable<BsonReader, E> createMapDecoder(Type type) {
return new BsonMapDecoder(this, type);
}
@Override
public ConvertType getConvertType() {
return ConvertType.BSON;

View File

@@ -0,0 +1,48 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.redkale.convert.bson;
import java.lang.reflect.Type;
import java.util.Map;
import org.redkale.convert.*;
/**
* Map的反序列化操作类 <br>
*
* <p>详情见: https://redkale.org
*
* @author zhangjx
* @param <K> Map key的数据类型
* @param <V> Map value的数据类型
*/
public class BsonMapDecoder<K, V> extends MapDecoder<BsonReader, K, V> {
public BsonMapDecoder(final BsonFactory factory, final Type type) {
super(factory, type);
}
@Override
public Map<K, V> convertFrom(BsonReader in, DeMember member) {
this.checkInited();
byte[] typevals = new byte[2];
int len = in.readMapB(member, typevals, this.keyDecoder, this.valueDecoder);
if (len == Reader.SIGN_NULL) {
return null;
}
Decodeable<BsonReader, K> kdecoder = BsonFactory.typeEnum(typevals[0]);
Decodeable<BsonReader, V> vdecoder = BsonFactory.typeEnum(typevals[1]);
final Map<K, V> result = this.creator.create();
// 固定长度
for (int i = 0; i < len; i++) {
K key = kdecoder.convertFrom(in);
in.readBlank();
V value = vdecoder.convertFrom(in);
result.put(key, value);
}
in.readMapE();
return result;
}
}

View File

@@ -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.ObjectPool;
import org.redkale.util.*;
import static org.redkale.convert.Reader.SIGN_NULL;
/**
* BSON数据源
@@ -129,6 +129,7 @@ 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);
}
@@ -139,7 +140,7 @@ public class BsonReader extends Reader {
@Override
public final String readObjectB(final Class clazz) {
final String newcls = readClassName();
if (newcls != null && !newcls.isEmpty()) {
if (Utility.isNotEmpty(newcls)) {
return newcls;
}
short bt = readShort();
@@ -166,6 +167,10 @@ public class BsonReader extends Reader {
}
@Override
public int readMapB(DeMember member, Decodeable keyDecoder, Decodeable valueDecoder) {
return readMapB(member, null, keyDecoder, valueDecoder);
}
public int readMapB(DeMember member, byte[] typevals, Decodeable keyDecoder, Decodeable valueDecoder) {
short bt = readShort();
if (bt == Reader.SIGN_NULL) {
@@ -186,12 +191,11 @@ public class BsonReader extends Reader {
// do nothing
}
/**
* 判断下一个非空白字节是否为[
*
* @return 数组长度或SIGN_NULL
*/
@Override
public int readArrayB(DeMember member, Decodeable componentDecoder) {
return readArrayB(member, null, componentDecoder);
}
public int readArrayB(DeMember member, byte[] typevals, Decodeable componentDecoder) { // componentDecoder可能为null
short bt = readShort();
if (bt == Reader.SIGN_NULL) {
@@ -223,20 +227,13 @@ public class BsonReader extends Reader {
return this.position;
}
@Override
public int readMemberContentLength(DeMember member, Decodeable decoder) {
return -1;
}
/**
* 判断对象是否存在下一个属性或者数组是否存在下一个元素
*
* @param startPosition 起始位置
* @param contentLength 内容大小, 不确定的传-1
* @return 是否存在
*/
@Override
public boolean hasNext(int startPosition, int contentLength) {
public boolean hasNext() {
byte b = readByte();
if (b == SIGN_HASNEXT) {
return true;
@@ -269,19 +266,13 @@ public class BsonReader extends Reader {
@Override
public final byte[] readByteArray() {
int len = readArrayB(null, null, null);
int contentLength = -1;
if (len == Reader.SIGN_NULL) {
return null;
}
if (len == Reader.SIGN_NOLENBUTBYTES) {
contentLength = readMemberContentLength(null, null);
len = Reader.SIGN_NOLENGTH;
}
if (len == Reader.SIGN_NOLENGTH) {
if (len == Reader.SIGN_VARIABLE) {
int size = 0;
byte[] data = new byte[8];
int startPosition = position();
while (hasNext(startPosition, contentLength)) {
while (hasNext()) {
if (size >= data.length) {
byte[] newdata = new byte[data.length + 4];
System.arraycopy(data, 0, newdata, 0, size);
@@ -330,7 +321,7 @@ public class BsonReader extends Reader {
| (((long) content[++this.position] & 0xff) << 24)
| (((long) content[++this.position] & 0xff) << 16)
| (((long) content[++this.position] & 0xff) << 8)
| (((long) content[++this.position] & 0xff)));
| ((long) content[++this.position] & 0xff));
}
@Override

View File

@@ -0,0 +1,45 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.redkale.convert.bson;
import java.lang.reflect.Type;
import java.util.*;
import java.util.stream.Stream;
import org.redkale.convert.*;
/**
* Stream的反序列化操作类 <br>
* 支持一定程度的泛型。 <br>
*
* <p>详情见: https://redkale.org
*
* @author zhangjx
* @param <T> 反解析的集合元素类型
*/
public class BsonStreamDecoder<T> extends StreamDecoder<BsonReader, T> {
public BsonStreamDecoder(final BsonFactory factory, final Type type) {
super(factory, type);
}
@Override
public Stream<T> convertFrom(BsonReader in, DeMember member) {
this.checkInited();
byte[] typevals = new byte[1];
int len = in.readArrayB(member, typevals, componentDecoder);
if (len == Reader.SIGN_NULL) {
return null;
}
final Decodeable<BsonReader, T> itemDecoder = BsonFactory.typeEnum(typevals[0]);
final List<T> result = new ArrayList();
// 固定长度
for (int i = 0; i < len; i++) {
result.add(itemDecoder.convertFrom(in));
}
in.readArrayE();
return result.stream();
}
}

View File

@@ -1,34 +0,0 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.redkale.convert.bson;
import java.lang.reflect.Type;
import org.redkale.convert.*;
/**
* 数组的反序列化操作类 <br>
* 对象数组的反序列化不包含int[]、long[]这样的primitive class数组。 <br>
* 支持一定程度的泛型。 <br>
*
* <p>详情见: https://redkale.org
*
* @author zhangjx
* @param <T> 反解析的数组元素类型
*/
public class SkipArrayDecoder<T> extends ArrayDecoder<BsonReader, T> {
public SkipArrayDecoder(final BsonFactory factory, final Type type) {
super(factory, type);
}
@Override
protected Decodeable<BsonReader, T> getComponentDecoder(Decodeable<BsonReader, T> decoder, byte[] typevals) {
if (typevals != null) {
return BsonFactory.typeEnum(typevals[0]);
}
return decoder;
}
}

View File

@@ -1,33 +0,0 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.redkale.convert.bson;
import java.lang.reflect.Type;
import org.redkale.convert.*;
/**
* Collection的反序列化操作类 <br>
* 支持一定程度的泛型。 <br>
*
* <p>详情见: https://redkale.org
*
* @author zhangjx
* @param <T> 反解析的集合元素类型
*/
public class SkipCollectionDecoder<T> extends CollectionDecoder<BsonReader, T> {
public SkipCollectionDecoder(final ConvertFactory factory, final Type type) {
super(factory, type);
}
@Override
protected Decodeable<BsonReader, T> getComponentDecoder(Decodeable<BsonReader, T> decoder, byte[] typevals) {
if (typevals != null) {
return BsonFactory.typeEnum(typevals[0]);
}
return decoder;
}
}

View File

@@ -1,41 +0,0 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.redkale.convert.bson;
import java.lang.reflect.Type;
import org.redkale.convert.*;
/**
* Map的反序列化操作类 <br>
*
* <p>详情见: https://redkale.org
*
* @author zhangjx
* @param <K> Map key的数据类型
* @param <V> Map value的数据类型
*/
public class SkipMapDecoder<K, V> extends MapDecoder<BsonReader, K, V> {
public SkipMapDecoder(final BsonFactory factory, final Type type) {
super(factory, type);
}
@Override
protected Decodeable<BsonReader, K> getKeyDecoder(Decodeable<BsonReader, K> decoder, byte[] typevals) {
if (typevals != null) {
return BsonFactory.typeEnum(typevals[0]);
}
return decoder;
}
@Override
protected Decodeable<BsonReader, V> getValueDecoder(Decodeable<BsonReader, V> decoder, byte[] typevals) {
if (typevals != null) {
return BsonFactory.typeEnum(typevals[1]);
}
return decoder;
}
}

View File

@@ -1,33 +0,0 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.redkale.convert.bson;
import java.lang.reflect.Type;
import org.redkale.convert.*;
/**
* Stream的反序列化操作类 <br>
* 支持一定程度的泛型。 <br>
*
* <p>详情见: https://redkale.org
*
* @author zhangjx
* @param <T> 反解析的集合元素类型
*/
public class SkipStreamDecoder<T> extends StreamDecoder<BsonReader, T> {
public SkipStreamDecoder(final BsonFactory factory, final Type type) {
super(factory, type);
}
@Override
protected Decodeable<BsonReader, T> getComponentDecoder(Decodeable<BsonReader, T> decoder, byte[] typevals) {
if (typevals != null) {
return BsonFactory.typeEnum(typevals[0]);
}
return decoder;
}
}

View File

@@ -40,20 +40,14 @@ public final class BoolArraySimpledCoder<R extends Reader, W extends Writer> ext
@Override
public boolean[] convertFrom(R in) {
int len = in.readArrayB(null, null, BoolSimpledCoder.instance);
int contentLength = -1;
int len = in.readArrayB(null, BoolSimpledCoder.instance);
if (len == Reader.SIGN_NULL) {
return null;
}
if (len == Reader.SIGN_NOLENBUTBYTES) {
contentLength = in.readMemberContentLength(null, BoolSimpledCoder.instance);
len = Reader.SIGN_NOLENGTH;
}
if (len == Reader.SIGN_NOLENGTH) {
if (len == Reader.SIGN_VARIABLE) {
int size = 0;
boolean[] data = new boolean[8];
int startPosition = in.position();
while (in.hasNext(startPosition, contentLength)) {
while (in.hasNext()) {
if (size >= data.length) {
boolean[] newdata = new boolean[data.length + 4];
System.arraycopy(data, 0, newdata, 0, size);

View File

@@ -41,20 +41,14 @@ public final class ByteBufferSimpledCoder<R extends Reader, W extends Writer> ex
@Override
public ByteBuffer convertFrom(R in) {
int len = in.readArrayB(null, null, ByteSimpledCoder.instance);
int contentLength = -1;
int len = in.readArrayB(null, ByteSimpledCoder.instance);
if (len == Reader.SIGN_NULL) {
return null;
}
if (len == Reader.SIGN_NOLENBUTBYTES) {
contentLength = in.readMemberContentLength(null, ByteSimpledCoder.instance);
len = Reader.SIGN_NOLENGTH;
}
if (len == Reader.SIGN_NOLENGTH) {
if (len == Reader.SIGN_VARIABLE) {
int size = 0;
byte[] data = new byte[8];
int startPosition = in.position();
while (in.hasNext(startPosition, contentLength)) {
while (in.hasNext()) {
if (size >= data.length) {
byte[] newdata = new byte[data.length + 4];
System.arraycopy(data, 0, newdata, 0, size);

View File

@@ -40,20 +40,14 @@ public final class CharArraySimpledCoder<R extends Reader, W extends Writer> ext
@Override
public char[] convertFrom(R in) {
int len = in.readArrayB(null, null, CharSimpledCoder.instance);
int contentLength = -1;
int len = in.readArrayB(null, CharSimpledCoder.instance);
if (len == Reader.SIGN_NULL) {
return null;
}
if (len == Reader.SIGN_NOLENBUTBYTES) {
contentLength = in.readMemberContentLength(null, CharSimpledCoder.instance);
len = Reader.SIGN_NOLENGTH;
}
if (len == Reader.SIGN_NOLENGTH) {
if (len == Reader.SIGN_VARIABLE) {
int size = 0;
char[] data = new char[8];
int startPosition = in.position();
while (in.hasNext(startPosition, contentLength)) {
while (in.hasNext()) {
if (size >= data.length) {
char[] newdata = new char[data.length + 4];
System.arraycopy(data, 0, newdata, 0, size);

View File

@@ -41,20 +41,14 @@ public final class DoubleArraySimpledCoder<R extends Reader, W extends Writer> e
@Override
public double[] convertFrom(R in) {
int len = in.readArrayB(null, null, DoubleSimpledCoder.instance);
int contentLength = -1;
int len = in.readArrayB(null, DoubleSimpledCoder.instance);
if (len == Reader.SIGN_NULL) {
return null;
}
if (len == Reader.SIGN_NOLENBUTBYTES) {
contentLength = in.readMemberContentLength(null, DoubleSimpledCoder.instance);
len = Reader.SIGN_NOLENGTH;
}
if (len == Reader.SIGN_NOLENGTH) {
if (len == Reader.SIGN_VARIABLE) {
int size = 0;
double[] data = new double[8];
int startPosition = in.position();
while (in.hasNext(startPosition, contentLength)) {
while (in.hasNext()) {
if (size >= data.length) {
double[] newdata = new double[data.length + 4];
System.arraycopy(data, 0, newdata, 0, size);

View File

@@ -40,20 +40,14 @@ public final class FloatArraySimpledCoder<R extends Reader, W extends Writer> ex
@Override
public float[] convertFrom(R in) {
int len = in.readArrayB(null, null, FloatSimpledCoder.instance);
int contentLength = -1;
int len = in.readArrayB(null, FloatSimpledCoder.instance);
if (len == Reader.SIGN_NULL) {
return null;
}
if (len == Reader.SIGN_NOLENBUTBYTES) {
contentLength = in.readMemberContentLength(null, FloatSimpledCoder.instance);
len = Reader.SIGN_NOLENGTH;
}
if (len == Reader.SIGN_NOLENGTH) {
if (len == Reader.SIGN_VARIABLE) {
int size = 0;
float[] data = new float[8];
int startPosition = in.position();
while (in.hasNext(startPosition, contentLength)) {
while (in.hasNext()) {
if (size >= data.length) {
float[] newdata = new float[data.length + 4];
System.arraycopy(data, 0, newdata, 0, size);

View File

@@ -41,20 +41,14 @@ public final class IntArraySimpledCoder<R extends Reader, W extends Writer> exte
@Override
public int[] convertFrom(R in) {
int len = in.readArrayB(null, null, IntSimpledCoder.instance);
int contentLength = -1;
int len = in.readArrayB(null, IntSimpledCoder.instance);
if (len == Reader.SIGN_NULL) {
return null;
}
if (len == Reader.SIGN_NOLENBUTBYTES) {
contentLength = in.readMemberContentLength(null, IntSimpledCoder.instance);
len = Reader.SIGN_NOLENGTH;
}
if (len == Reader.SIGN_NOLENGTH) {
if (len == Reader.SIGN_VARIABLE) {
int size = 0;
int[] data = new int[8];
int startPosition = in.position();
while (in.hasNext(startPosition, contentLength)) {
while (in.hasNext()) {
if (size >= data.length) {
int[] newdata = new int[data.length + 4];
System.arraycopy(data, 0, newdata, 0, size);

View File

@@ -41,20 +41,14 @@ public final class LongArraySimpledCoder<R extends Reader, W extends Writer> ext
@Override
public long[] convertFrom(R in) {
int len = in.readArrayB(null, null, LongSimpledCoder.instance);
int contentLength = -1;
int len = in.readArrayB(null, LongSimpledCoder.instance);
if (len == Reader.SIGN_NULL) {
return null;
}
if (len == Reader.SIGN_NOLENBUTBYTES) {
contentLength = in.readMemberContentLength(null, LongSimpledCoder.instance);
len = Reader.SIGN_NOLENGTH;
}
if (len == Reader.SIGN_NOLENGTH) {
if (len == Reader.SIGN_VARIABLE) {
int size = 0;
long[] data = new long[8];
int startPosition = in.position();
while (in.hasNext(startPosition, contentLength)) {
while (in.hasNext()) {
if (size >= data.length) {
long[] newdata = new long[data.length + 4];
System.arraycopy(data, 0, newdata, 0, size);

View File

@@ -40,20 +40,14 @@ public final class ShortArraySimpledCoder<R extends Reader, W extends Writer> ex
@Override
public short[] convertFrom(R in) {
int len = in.readArrayB(null, null, ShortSimpledCoder.instance);
int contentLength = -1;
int len = in.readArrayB(null, ShortSimpledCoder.instance);
if (len == Reader.SIGN_NULL) {
return null;
}
if (len == Reader.SIGN_NOLENBUTBYTES) {
contentLength = in.readMemberContentLength(null, ShortSimpledCoder.instance);
len = Reader.SIGN_NOLENGTH;
}
if (len == Reader.SIGN_NOLENGTH) {
if (len == Reader.SIGN_VARIABLE) {
int size = 0;
short[] data = new short[8];
int startPosition = in.position();
while (in.hasNext(startPosition, contentLength)) {
while (in.hasNext()) {
if (size >= data.length) {
short[] newdata = new short[data.length + 4];
System.arraycopy(data, 0, newdata, 0, size);

View File

@@ -44,20 +44,14 @@ public final class StringArraySimpledCoder<R extends Reader, W extends Writer> e
}
public String[] convertFrom(R in, DeMember member) {
int len = in.readArrayB(member, null, StringSimpledCoder.instance);
int contentLength = -1;
int len = in.readArrayB(member, StringSimpledCoder.instance);
if (len == Reader.SIGN_NULL) {
return null;
}
if (len == Reader.SIGN_NOLENBUTBYTES) {
contentLength = in.readMemberContentLength(null, StringSimpledCoder.instance);
len = Reader.SIGN_NOLENGTH;
}
if (len == Reader.SIGN_NOLENGTH) {
if (len == Reader.SIGN_VARIABLE) {
int size = 0;
String[] data = new String[8];
int startPosition = in.position();
while (in.hasNext(startPosition, contentLength)) {
while (in.hasNext()) {
if (size >= data.length) {
String[] newdata = new String[data.length + 4];
System.arraycopy(data, 0, newdata, 0, size);

View File

@@ -160,7 +160,7 @@ public class JsonByteBufferReader extends JsonReader {
/**
* 判断下一个非空白字符是否为{
*
* @return SIGN_NOLENGTH 或 SIGN_NULL
* @return SIGN_VARIABLE 或 SIGN_NULL
*/
@Override
public final String readObjectB(final Class clazz) {
@@ -181,15 +181,14 @@ public class JsonByteBufferReader extends JsonReader {
* 判断下一个非空白字符是否为[
*
* @param member DeMember
* @param typevals byte[]
* @param decoder Decodeable
* @return SIGN_NOLENGTH 或 SIGN_NULL
* @return SIGN_VARIABLE 或 SIGN_NULL
*/
@Override
public final int readArrayB(DeMember member, byte[] typevals, Decodeable decoder) {
public final int readArrayB(DeMember member, Decodeable decoder) {
char ch = nextGoodChar(true);
if (ch == '[' || ch == '{') {
return SIGN_NOLENGTH;
return SIGN_VARIABLE;
}
if (ch == 'n' && nextChar() == 'u' && nextChar() == 'l' && nextChar() == 'l') {
return SIGN_NULL;

View File

@@ -39,16 +39,15 @@ public class JsonMultiArrayDecoder implements Decodeable<JsonReader, Object[]> {
}
public Object[] convertFrom(JsonReader in, DeMember member) {
int len = in.readArrayB(member, null, null);
int len = in.readArrayB(member, null);
if (len == Reader.SIGN_NULL) {
return null;
}
// len must be Reader.SIGN_NOLENGTH
// len must be Reader.SIGN_VARIABLE
final List<Object> result = new ArrayList();
int startPosition = in.position();
int index = -1;
final Decodeable[] coders = this.decoders;
while (in.hasNext(startPosition, -1)) {
while (in.hasNext()) {
result.add(coders[++index % coders.length].convertFrom(in));
}
in.readArrayE();

View File

@@ -6,8 +6,7 @@
package org.redkale.convert.json;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Objects;
import java.util.*;
import org.redkale.convert.*;
import static org.redkale.convert.Reader.*;
import org.redkale.convert.Reader.ValueType;
@@ -299,14 +298,13 @@ public class JsonReader extends Reader {
* 判断下一个非空白字符是否为{
*
* @param member DeMember
* @param typevals byte[]
* @param keyDecoder Decodeable
* @param valuedecoder Decodeable
* @return SIGN_NOLENGTH 或 SIGN_NULL
* @return SIGN_VARIABLE 或 SIGN_NULL
*/
@Override
public final int readMapB(DeMember member, byte[] typevals, Decodeable keyDecoder, Decodeable valuedecoder) {
return readArrayB(member, typevals, keyDecoder);
public final int readMapB(DeMember member, Decodeable keyDecoder, Decodeable valuedecoder) {
return readArrayB(member, keyDecoder);
}
@Override
@@ -318,21 +316,20 @@ public class JsonReader extends Reader {
* 判断下一个非空白字符是否为[
*
* @param member DeMember
* @param typevals byte[]
* @param componentDecoder Decodeable
* @return SIGN_NOLENGTH 或 SIGN_NULL
* @return SIGN_VARIABLE 或 SIGN_NULL
*/
@Override
public int readArrayB(DeMember member, byte[] typevals, Decodeable componentDecoder) {
public int readArrayB(DeMember member, Decodeable componentDecoder) {
if (this.text.length == 0) {
return SIGN_NULL;
}
char ch = nextGoodChar(true);
if (ch == '[') {
return SIGN_NOLENGTH;
return SIGN_VARIABLE;
}
if (ch == '{') {
return SIGN_NOLENGTH;
return SIGN_VARIABLE;
}
if (ch == 'n' && text[++position] == 'u' && text[++position] == 'l' && text[++position] == 'l') {
return SIGN_NULL;
@@ -365,20 +362,13 @@ public class JsonReader extends Reader {
return this.position;
}
@Override
public int readMemberContentLength(DeMember member, Decodeable decoder) {
return -1;
}
/**
* 判断对象是否存在下一个属性或者数组是否存在下一个元素
*
* @param startPosition 起始位置
* @param contentLength 内容大小, 不确定的传-1
* @return 是否存在
*/
@Override
public final boolean hasNext(int startPosition, int contentLength) {
public final boolean hasNext() {
char ch = nextGoodChar(true);
if (ch == ',') {
char nt = nextGoodChar(true);
@@ -730,20 +720,14 @@ public class JsonReader extends Reader {
@Override
public final byte[] readByteArray() {
int len = readArrayB(null, null, null);
int contentLength = -1;
int len = readArrayB(null, null);
if (len == Reader.SIGN_NULL) {
return null;
}
if (len == Reader.SIGN_NOLENBUTBYTES) {
contentLength = readMemberContentLength(null, null);
len = Reader.SIGN_NOLENGTH;
}
if (len == Reader.SIGN_NOLENGTH) {
if (len == Reader.SIGN_VARIABLE) {
int size = 0;
byte[] data = new byte[8];
int startPosition = position();
while (hasNext(startPosition, contentLength)) {
while (hasNext()) {
if (size >= data.length) {
byte[] newdata = new byte[data.length + 4];
System.arraycopy(data, 0, newdata, 0, size);
@@ -755,7 +739,7 @@ public class JsonReader extends Reader {
byte[] newdata = new byte[size];
System.arraycopy(data, 0, newdata, 0, size);
return newdata;
} else {
} else { // 固定长度
byte[] values = new byte[len];
for (int i = 0; i < values.length; i++) {
values[i] = readByte();

View File

@@ -6,6 +6,7 @@
package org.redkale.convert.pb;
import java.lang.reflect.Type;
import java.util.*;
import org.redkale.convert.*;
/**
@@ -24,6 +25,27 @@ public class ProtobufArrayDecoder<T> extends ArrayDecoder<ProtobufReader, T> {
}
@Override
public T[] convertFrom(ProtobufReader in, DeMember member) {
this.checkInited();
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) { // 元素读取完毕
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);
}

View File

@@ -6,6 +6,7 @@
package org.redkale.convert.pb;
import java.lang.reflect.Type;
import java.util.Collection;
import org.redkale.convert.*;
/**
@@ -22,6 +23,26 @@ public class ProtobufCollectionDecoder<T> extends CollectionDecoder<ProtobufRead
}
@Override
public Collection<T> convertFrom(ProtobufReader in, DeMember member) {
this.checkInited();
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) { // 元素读取完毕
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);
}

View File

@@ -6,6 +6,7 @@
package org.redkale.convert.pb;
import java.lang.reflect.Type;
import java.util.Map;
import org.redkale.convert.*;
/**
@@ -23,6 +24,29 @@ public class ProtobufMapDecoder<K, V> extends MapDecoder<ProtobufReader, K, V> {
}
@Override
public Map<K, V> convertFrom(ProtobufReader in, DeMember member) {
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;
while (in.hasNext()) {
ProtobufReader entryReader = getEntryReader(in, member, first);
if (entryReader == null) {
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();
@@ -34,18 +58,4 @@ public class ProtobufMapDecoder<K, V> extends MapDecoder<ProtobufReader, K, V> {
byte[] bs = in.readByteArray();
return new ProtobufReader(bs);
}
@Override
protected K readKeyMember(
ProtobufReader in, DeMember member, Decodeable<ProtobufReader, K> decoder, boolean first) {
in.readTag();
return decoder.convertFrom(in);
}
@Override
protected V readValueMember(
ProtobufReader in, DeMember member, Decodeable<ProtobufReader, V> decoder, boolean first) {
in.readTag();
return decoder.convertFrom(in);
}
}

View File

@@ -46,11 +46,13 @@ public class ProtobufMapEncoder<K, V> extends MapEncoder<ProtobufWriter, K, V> {
V v = mapFieldFunc == null ? val : mapFieldFunc.apply(key, val);
if (v != null) {
out.writeFieldName(member);
ProtobufWriter tmp = out.pollChild();
tmp.writeTag(keyTag);
kencoder.convertTo(tmp, key);
tmp.writeTag(valTag);
vencoder.convertTo(tmp, v);
out.writeLength(tmp.count());
out.writeTo(tmp.toArray());
out.offerChild(tmp);

View File

@@ -5,7 +5,6 @@
*/
package org.redkale.convert.pb;
import java.lang.reflect.Type;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.concurrent.atomic.*;
@@ -123,8 +122,8 @@ public class ProtobufReader extends Reader {
}
@Override
public final int readMapB(DeMember member, byte[] typevals, Decodeable keyDecoder, Decodeable valueDecoder) {
return Reader.SIGN_NOLENGTH;
public final int readMapB(DeMember member, Decodeable keyDecoder, Decodeable valueDecoder) {
return Reader.SIGN_VARIABLE;
}
@Override
@@ -136,23 +135,12 @@ public class ProtobufReader extends Reader {
* 判断下一个非空白字符是否为[
*
* @param member DeMember
* @param typevals byte[]
* @param componentDecoder Decodeable
* @return SIGN_NOLENGTH 或 SIGN_NULL
* @return SIGN_VARIABLE 或 SIGN_NULL
*/
@Override
public final int readArrayB(DeMember member, byte[] typevals, Decodeable componentDecoder) {
if (member == null || componentDecoder == null) {
return Reader.SIGN_NOLENBUTBYTES;
}
Type type = componentDecoder.getType();
if (!(type instanceof Class)) {
return Reader.SIGN_NOLENBUTBYTES;
}
if (ProtobufFactory.isNoLenBytesType(type)) {
return Reader.SIGN_NOLENBUTBYTES;
}
return Reader.SIGN_NOLENGTH;
public final int readArrayB(DeMember member, Decodeable componentDecoder) {
return Reader.SIGN_VARIABLE;
}
@Override
@@ -171,7 +159,6 @@ public class ProtobufReader extends Reader {
return this.position;
}
@Override
public final int readMemberContentLength(DeMember member, Decodeable decoder) {
if (member == null && decoder == null) {
return -1; // 为byte[]
@@ -482,6 +469,7 @@ public class ProtobufReader extends Reader {
return this.content[this.position];
}
@Override
public boolean hasNext() {
return (this.position + 1) < this.content.length;
}
@@ -493,7 +481,6 @@ public class ProtobufReader extends Reader {
* @param contentLength 内容大小, 不确定的传-1
* @return 是否存在
*/
@Override
public boolean hasNext(int startPosition, int contentLength) {
// ("-------------: " + startPosition + ", " + contentLength + ", " + this.position);
if (startPosition >= 0 && contentLength >= 0) {

View File

@@ -6,6 +6,8 @@
package org.redkale.convert.pb;
import java.lang.reflect.Type;
import java.util.*;
import java.util.stream.Stream;
import org.redkale.convert.*;
/**
@@ -22,6 +24,26 @@ public class ProtobufStreamDecoder<T> extends StreamDecoder<ProtobufReader, T> {
}
@Override
public Stream<T> convertFrom(ProtobufReader in, DeMember member) {
this.checkInited();
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) { // 元素读取完毕
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);
}

View File

@@ -326,9 +326,10 @@ public class ProtobufWriter extends Writer implements ByteTuple {
// do nothing
}
// 被ObjectEncoder调用
@Override
public void writeFieldName(EnMember member, String fieldName, Type fieldType, int fieldPos) {
writeTag(member.getTag());
writeTag(member != null ? member.getTag() : fieldPos);
}
@Override