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); return convertFrom(in, null);
} }
@Override
public T[] convertFrom(R in, DeMember member) { public T[] convertFrom(R in, DeMember member) {
this.checkInited(); this.checkInited();
byte[] typevals = new byte[1]; final Decodeable<R, T> itemDecoder = this.componentDecoder;
int len = in.readArrayB(member, typevals, componentDecoder); int len = in.readArrayB(member, itemDecoder);
int contentLength = -1;
if (len == Reader.SIGN_NULL) { if (len == Reader.SIGN_NULL) {
return 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(); final List<T> result = new ArrayList();
boolean first = true; if (len == Reader.SIGN_VARIABLE) {
if (len == Reader.SIGN_NOLENGTH) { while (in.hasNext()) {
int startPosition = in.position(); result.add(itemDecoder.convertFrom(in));
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;
} }
} else { } else { // 固定长度
for (int i = 0; i < len; i++) { for (int i = 0; i < len; i++) {
result.add(localDecoder.convertFrom(in)); result.add(itemDecoder.convertFrom(in));
} }
} }
in.readArrayE(); in.readArrayE();
@@ -126,25 +114,6 @@ public class ArrayDecoder<R extends Reader, T> implements TagDecodeable<R, T[]>
return result.toArray(rs); 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 @Override
public String toString() { public String toString() {
return this.getClass().getSimpleName() + "{componentType:" + this.componentType + ", decoder:" 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) { public Collection<T> convertFrom(R in, DeMember member) {
this.checkInited(); this.checkInited();
byte[] typevals = new byte[1]; final Decodeable<R, T> itemDecoder = this.componentDecoder;
int len = in.readArrayB(member, typevals, componentDecoder); int size = in.readArrayB(member, itemDecoder);
int contentLength = -1; if (size == Reader.SIGN_NULL) {
if (len == Reader.SIGN_NULL) {
return 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(); final Collection<T> result = this.creator.create();
boolean first = true; if (size == Reader.SIGN_VARIABLE) {
if (len == Reader.SIGN_NOLENGTH) { while (in.hasNext()) {
int startPosition = in.position(); result.add(itemDecoder.convertFrom(in));
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;
} }
} else { } else { // 固定长度
for (int i = 0; i < len; i++) { for (int i = 0; i < size; i++) {
result.add(localDecoder.convertFrom(in)); result.add(itemDecoder.convertFrom(in));
} }
} }
in.readArrayE(); in.readArrayE();
return result; 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 @Override
public Type getType() { public Type getType() {
return type; return type;

View File

@@ -121,70 +121,32 @@ public class MapDecoder<R extends Reader, K, V> implements TagDecodeable<R, Map<
@Override @Override
public Map<K, V> convertFrom(R in, DeMember member) { public Map<K, V> convertFrom(R in, DeMember member) {
this.checkInited(); this.checkInited();
byte[] typevals = new byte[2]; Decodeable<R, K> kdecoder = this.keyDecoder;
int len = in.readMapB(member, typevals, this.keyDecoder, this.valueDecoder); Decodeable<R, V> vdecoder = this.valueDecoder;
int contentLength = -1; int len = in.readMapB(member, kdecoder, vdecoder);
if (len == Reader.SIGN_NULL) { if (len == Reader.SIGN_NULL) {
return 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(); final Map<K, V> result = this.creator.create();
boolean first = true; if (len == Reader.SIGN_VARIABLE) {
Decodeable<R, K> kdecoder = getKeyDecoder(this.keyDecoder, typevals); while (in.hasNext()) {
Decodeable<R, V> vdecoder = getValueDecoder(this.valueDecoder, typevals); K key = kdecoder.convertFrom(in);
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);
in.readBlank(); 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); result.put(key, value);
first = false;
} }
} }
in.readMapE(); in.readMapE();
return result; 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 @Override
public Type getType() { public Type getType() {
return this.type; return this.type;

View File

@@ -349,16 +349,15 @@ public class ObjectEncoder<W extends Writer, T> implements Encodeable<W, T> {
if (extFields != null) { if (extFields != null) {
Encodeable<W, ?> anyEncoder = factory.getAnyEncoder(); Encodeable<W, ?> anyEncoder = factory.getAnyEncoder();
for (ConvertField en : extFields) { for (ConvertField en : extFields) {
if (en == null) { if (en != null) {
continue; 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; MAP;
} }
/**
* 集合对象为null
*
* @see #readArrayB(org.redkale.convert.DeMember, org.redkale.convert.Decodeable)
*/
public static final short SIGN_NULL = -1; public static final short SIGN_NULL = -1;
public static final short SIGN_NOLENGTH = -2; /**
* 不确定的长度, 比如解析json数组
// 目前只适合于protobuf的boolean[]...double[]类型 *
public static final short SIGN_NOLENBUTBYTES = -3; * @see #readArrayB(org.redkale.convert.DeMember, org.redkale.convert.Decodeable)
*/
public static final short SIGN_VARIABLE = -2;
/** /**
* 设置Reader的内容通常结合对象池使用 * 设置Reader的内容通常结合对象池使用
@@ -34,24 +41,12 @@ public abstract class Reader {
*/ */
public abstract void prepare(byte[] content); 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 是否还存在下个元素或字段 * @return 是否还存在下个元素或字段
*/ */
public boolean hasNext() { public abstract boolean hasNext();
return hasNext(-1, -1);
}
/** /**
* 获取当前位置 * 获取当前位置
@@ -60,16 +55,6 @@ public abstract class Reader {
*/ */
public abstract int position(); 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(); public abstract void skipValue();
@@ -103,12 +88,13 @@ public abstract class Reader {
/** /**
* 读取数组的开头并返回数组的长度 * 读取数组的开头并返回数组的长度
* *
* @see #SIGN_NULL
* @see #SIGN_VARIABLE
* @param member DeMember * @param member DeMember
* @param typevals byte[]
* @param componentDecoder Decodeable * @param componentDecoder Decodeable
* @return 返回数组的长度 * @return 返回数组的长度
*/ */
public abstract int readArrayB(DeMember member, byte[] typevals, Decodeable componentDecoder); public abstract int readArrayB(DeMember member, Decodeable componentDecoder);
/** 读取数组的尾端 */ /** 读取数组的尾端 */
public abstract void readArrayE(); public abstract void readArrayE();
@@ -117,12 +103,11 @@ public abstract class Reader {
* 读取map的开头并返回map的size * 读取map的开头并返回map的size
* *
* @param member DeMember * @param member DeMember
* @param typevals byte[]
* @param keyDecoder Decodeable * @param keyDecoder Decodeable
* @param valueDecoder Decodeable * @param valueDecoder Decodeable
* @return 返回map的size * @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(); 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) { public Stream<T> convertFrom(R in, DeMember member) {
this.checkInited(); this.checkInited();
byte[] typevals = new byte[1]; final Decodeable<R, T> itemDecoder = this.componentDecoder;
int len = in.readArrayB(member, typevals, this.componentDecoder); int len = in.readArrayB(member, itemDecoder);
int contentLength = -1;
if (len == Reader.SIGN_NULL) { if (len == Reader.SIGN_NULL) {
return 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(); final List<T> result = new ArrayList();
boolean first = true; if (len == Reader.SIGN_VARIABLE) {
if (len == Reader.SIGN_NOLENGTH) { while (in.hasNext()) {
int startPosition = in.position(); result.add(itemDecoder.convertFrom(in));
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;
} }
} else { } else { // 固定长度
for (int i = 0; i < len; i++) { for (int i = 0; i < len; i++) {
result.add(localDecoder.convertFrom(in)); result.add(itemDecoder.convertFrom(in));
} }
} }
in.readArrayE(); in.readArrayE();
return result.stream(); 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 @Override
public Type getType() { public Type getType() {
return type; 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; package org.redkale.convert.bson;
import static org.redkale.convert.Reader.SIGN_NULL;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import org.redkale.convert.*; import org.redkale.convert.*;
import org.redkale.convert.ext.ByteSimpledCoder; import org.redkale.convert.ext.ByteSimpledCoder;
import static org.redkale.convert.Reader.SIGN_NULL;
/** /**
* 以ByteBuffer为数据载体的BsonReader * 以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 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 = static final Decodeable skipCollectionDecoder =
new SkipCollectionDecoder(instance, new TypeToken<Collection<Object>>() {}.getType()); new BsonCollectionDecoder(instance, new TypeToken<Collection<Object>>() {}.getType());
static final Decodeable skipStreamDecoder = 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 { static {
instance.register(Serializable.class, objectDecoder); instance.register(Serializable.class, objectDecoder);
@@ -120,6 +120,26 @@ public final class BsonFactory extends ConvertFactory<BsonReader, BsonWriter> {
return new BsonFactory(this, features); 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 @Override
public ConvertType getConvertType() { public ConvertType getConvertType() {
return ConvertType.BSON; 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 java.nio.charset.StandardCharsets;
import org.redkale.convert.*; import org.redkale.convert.*;
import static org.redkale.convert.Reader.SIGN_NULL;
import org.redkale.convert.ext.ByteSimpledCoder; import org.redkale.convert.ext.ByteSimpledCoder;
import org.redkale.util.ObjectPool; import org.redkale.util.*;
import static org.redkale.convert.Reader.SIGN_NULL;
/** /**
* BSON数据源 * BSON数据源
@@ -129,6 +129,7 @@ public class BsonReader extends Reader {
break; break;
default: default:
Decodeable decoder = BsonFactory.typeEnum(val); Decodeable decoder = BsonFactory.typeEnum(val);
System.out.println("val = " + val + ", decoder = " + decoder);
if (decoder != null) { if (decoder != null) {
decoder.convertFrom(this); decoder.convertFrom(this);
} }
@@ -139,7 +140,7 @@ public class BsonReader extends Reader {
@Override @Override
public final String readObjectB(final Class clazz) { public final String readObjectB(final Class clazz) {
final String newcls = readClassName(); final String newcls = readClassName();
if (newcls != null && !newcls.isEmpty()) { if (Utility.isNotEmpty(newcls)) {
return newcls; return newcls;
} }
short bt = readShort(); short bt = readShort();
@@ -166,6 +167,10 @@ public class BsonReader extends Reader {
} }
@Override @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) { public int readMapB(DeMember member, byte[] typevals, Decodeable keyDecoder, Decodeable valueDecoder) {
short bt = readShort(); short bt = readShort();
if (bt == Reader.SIGN_NULL) { if (bt == Reader.SIGN_NULL) {
@@ -186,12 +191,11 @@ public class BsonReader extends Reader {
// do nothing // do nothing
} }
/**
* 判断下一个非空白字节是否为[
*
* @return 数组长度或SIGN_NULL
*/
@Override @Override
public int readArrayB(DeMember member, Decodeable componentDecoder) {
return readArrayB(member, null, componentDecoder);
}
public int readArrayB(DeMember member, byte[] typevals, Decodeable componentDecoder) { // componentDecoder可能为null public int readArrayB(DeMember member, byte[] typevals, Decodeable componentDecoder) { // componentDecoder可能为null
short bt = readShort(); short bt = readShort();
if (bt == Reader.SIGN_NULL) { if (bt == Reader.SIGN_NULL) {
@@ -223,20 +227,13 @@ public class BsonReader extends Reader {
return this.position; return this.position;
} }
@Override
public int readMemberContentLength(DeMember member, Decodeable decoder) {
return -1;
}
/** /**
* 判断对象是否存在下一个属性或者数组是否存在下一个元素 * 判断对象是否存在下一个属性或者数组是否存在下一个元素
* *
* @param startPosition 起始位置
* @param contentLength 内容大小, 不确定的传-1
* @return 是否存在 * @return 是否存在
*/ */
@Override @Override
public boolean hasNext(int startPosition, int contentLength) { public boolean hasNext() {
byte b = readByte(); byte b = readByte();
if (b == SIGN_HASNEXT) { if (b == SIGN_HASNEXT) {
return true; return true;
@@ -269,19 +266,13 @@ public class BsonReader extends Reader {
@Override @Override
public final byte[] readByteArray() { public final byte[] readByteArray() {
int len = readArrayB(null, null, null); int len = readArrayB(null, null, null);
int contentLength = -1;
if (len == Reader.SIGN_NULL) { if (len == Reader.SIGN_NULL) {
return null; return null;
} }
if (len == Reader.SIGN_NOLENBUTBYTES) { if (len == Reader.SIGN_VARIABLE) {
contentLength = readMemberContentLength(null, null);
len = Reader.SIGN_NOLENGTH;
}
if (len == Reader.SIGN_NOLENGTH) {
int size = 0; int size = 0;
byte[] data = new byte[8]; byte[] data = new byte[8];
int startPosition = position(); while (hasNext()) {
while (hasNext(startPosition, contentLength)) {
if (size >= data.length) { if (size >= data.length) {
byte[] newdata = new byte[data.length + 4]; byte[] newdata = new byte[data.length + 4];
System.arraycopy(data, 0, newdata, 0, size); 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) << 24)
| (((long) content[++this.position] & 0xff) << 16) | (((long) content[++this.position] & 0xff) << 16)
| (((long) content[++this.position] & 0xff) << 8) | (((long) content[++this.position] & 0xff) << 8)
| (((long) content[++this.position] & 0xff))); | ((long) content[++this.position] & 0xff));
} }
@Override @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 @Override
public boolean[] convertFrom(R in) { public boolean[] convertFrom(R in) {
int len = in.readArrayB(null, null, BoolSimpledCoder.instance); int len = in.readArrayB(null, BoolSimpledCoder.instance);
int contentLength = -1;
if (len == Reader.SIGN_NULL) { if (len == Reader.SIGN_NULL) {
return null; return null;
} }
if (len == Reader.SIGN_NOLENBUTBYTES) { if (len == Reader.SIGN_VARIABLE) {
contentLength = in.readMemberContentLength(null, BoolSimpledCoder.instance);
len = Reader.SIGN_NOLENGTH;
}
if (len == Reader.SIGN_NOLENGTH) {
int size = 0; int size = 0;
boolean[] data = new boolean[8]; boolean[] data = new boolean[8];
int startPosition = in.position(); while (in.hasNext()) {
while (in.hasNext(startPosition, contentLength)) {
if (size >= data.length) { if (size >= data.length) {
boolean[] newdata = new boolean[data.length + 4]; boolean[] newdata = new boolean[data.length + 4];
System.arraycopy(data, 0, newdata, 0, size); 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 @Override
public ByteBuffer convertFrom(R in) { public ByteBuffer convertFrom(R in) {
int len = in.readArrayB(null, null, ByteSimpledCoder.instance); int len = in.readArrayB(null, ByteSimpledCoder.instance);
int contentLength = -1;
if (len == Reader.SIGN_NULL) { if (len == Reader.SIGN_NULL) {
return null; return null;
} }
if (len == Reader.SIGN_NOLENBUTBYTES) { if (len == Reader.SIGN_VARIABLE) {
contentLength = in.readMemberContentLength(null, ByteSimpledCoder.instance);
len = Reader.SIGN_NOLENGTH;
}
if (len == Reader.SIGN_NOLENGTH) {
int size = 0; int size = 0;
byte[] data = new byte[8]; byte[] data = new byte[8];
int startPosition = in.position(); while (in.hasNext()) {
while (in.hasNext(startPosition, contentLength)) {
if (size >= data.length) { if (size >= data.length) {
byte[] newdata = new byte[data.length + 4]; byte[] newdata = new byte[data.length + 4];
System.arraycopy(data, 0, newdata, 0, size); 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 @Override
public char[] convertFrom(R in) { public char[] convertFrom(R in) {
int len = in.readArrayB(null, null, CharSimpledCoder.instance); int len = in.readArrayB(null, CharSimpledCoder.instance);
int contentLength = -1;
if (len == Reader.SIGN_NULL) { if (len == Reader.SIGN_NULL) {
return null; return null;
} }
if (len == Reader.SIGN_NOLENBUTBYTES) { if (len == Reader.SIGN_VARIABLE) {
contentLength = in.readMemberContentLength(null, CharSimpledCoder.instance);
len = Reader.SIGN_NOLENGTH;
}
if (len == Reader.SIGN_NOLENGTH) {
int size = 0; int size = 0;
char[] data = new char[8]; char[] data = new char[8];
int startPosition = in.position(); while (in.hasNext()) {
while (in.hasNext(startPosition, contentLength)) {
if (size >= data.length) { if (size >= data.length) {
char[] newdata = new char[data.length + 4]; char[] newdata = new char[data.length + 4];
System.arraycopy(data, 0, newdata, 0, size); 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 @Override
public double[] convertFrom(R in) { public double[] convertFrom(R in) {
int len = in.readArrayB(null, null, DoubleSimpledCoder.instance); int len = in.readArrayB(null, DoubleSimpledCoder.instance);
int contentLength = -1;
if (len == Reader.SIGN_NULL) { if (len == Reader.SIGN_NULL) {
return null; return null;
} }
if (len == Reader.SIGN_NOLENBUTBYTES) { if (len == Reader.SIGN_VARIABLE) {
contentLength = in.readMemberContentLength(null, DoubleSimpledCoder.instance);
len = Reader.SIGN_NOLENGTH;
}
if (len == Reader.SIGN_NOLENGTH) {
int size = 0; int size = 0;
double[] data = new double[8]; double[] data = new double[8];
int startPosition = in.position(); while (in.hasNext()) {
while (in.hasNext(startPosition, contentLength)) {
if (size >= data.length) { if (size >= data.length) {
double[] newdata = new double[data.length + 4]; double[] newdata = new double[data.length + 4];
System.arraycopy(data, 0, newdata, 0, size); 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 @Override
public float[] convertFrom(R in) { public float[] convertFrom(R in) {
int len = in.readArrayB(null, null, FloatSimpledCoder.instance); int len = in.readArrayB(null, FloatSimpledCoder.instance);
int contentLength = -1;
if (len == Reader.SIGN_NULL) { if (len == Reader.SIGN_NULL) {
return null; return null;
} }
if (len == Reader.SIGN_NOLENBUTBYTES) { if (len == Reader.SIGN_VARIABLE) {
contentLength = in.readMemberContentLength(null, FloatSimpledCoder.instance);
len = Reader.SIGN_NOLENGTH;
}
if (len == Reader.SIGN_NOLENGTH) {
int size = 0; int size = 0;
float[] data = new float[8]; float[] data = new float[8];
int startPosition = in.position(); while (in.hasNext()) {
while (in.hasNext(startPosition, contentLength)) {
if (size >= data.length) { if (size >= data.length) {
float[] newdata = new float[data.length + 4]; float[] newdata = new float[data.length + 4];
System.arraycopy(data, 0, newdata, 0, size); 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 @Override
public int[] convertFrom(R in) { public int[] convertFrom(R in) {
int len = in.readArrayB(null, null, IntSimpledCoder.instance); int len = in.readArrayB(null, IntSimpledCoder.instance);
int contentLength = -1;
if (len == Reader.SIGN_NULL) { if (len == Reader.SIGN_NULL) {
return null; return null;
} }
if (len == Reader.SIGN_NOLENBUTBYTES) { if (len == Reader.SIGN_VARIABLE) {
contentLength = in.readMemberContentLength(null, IntSimpledCoder.instance);
len = Reader.SIGN_NOLENGTH;
}
if (len == Reader.SIGN_NOLENGTH) {
int size = 0; int size = 0;
int[] data = new int[8]; int[] data = new int[8];
int startPosition = in.position(); while (in.hasNext()) {
while (in.hasNext(startPosition, contentLength)) {
if (size >= data.length) { if (size >= data.length) {
int[] newdata = new int[data.length + 4]; int[] newdata = new int[data.length + 4];
System.arraycopy(data, 0, newdata, 0, size); 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 @Override
public long[] convertFrom(R in) { public long[] convertFrom(R in) {
int len = in.readArrayB(null, null, LongSimpledCoder.instance); int len = in.readArrayB(null, LongSimpledCoder.instance);
int contentLength = -1;
if (len == Reader.SIGN_NULL) { if (len == Reader.SIGN_NULL) {
return null; return null;
} }
if (len == Reader.SIGN_NOLENBUTBYTES) { if (len == Reader.SIGN_VARIABLE) {
contentLength = in.readMemberContentLength(null, LongSimpledCoder.instance);
len = Reader.SIGN_NOLENGTH;
}
if (len == Reader.SIGN_NOLENGTH) {
int size = 0; int size = 0;
long[] data = new long[8]; long[] data = new long[8];
int startPosition = in.position(); while (in.hasNext()) {
while (in.hasNext(startPosition, contentLength)) {
if (size >= data.length) { if (size >= data.length) {
long[] newdata = new long[data.length + 4]; long[] newdata = new long[data.length + 4];
System.arraycopy(data, 0, newdata, 0, size); 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 @Override
public short[] convertFrom(R in) { public short[] convertFrom(R in) {
int len = in.readArrayB(null, null, ShortSimpledCoder.instance); int len = in.readArrayB(null, ShortSimpledCoder.instance);
int contentLength = -1;
if (len == Reader.SIGN_NULL) { if (len == Reader.SIGN_NULL) {
return null; return null;
} }
if (len == Reader.SIGN_NOLENBUTBYTES) { if (len == Reader.SIGN_VARIABLE) {
contentLength = in.readMemberContentLength(null, ShortSimpledCoder.instance);
len = Reader.SIGN_NOLENGTH;
}
if (len == Reader.SIGN_NOLENGTH) {
int size = 0; int size = 0;
short[] data = new short[8]; short[] data = new short[8];
int startPosition = in.position(); while (in.hasNext()) {
while (in.hasNext(startPosition, contentLength)) {
if (size >= data.length) { if (size >= data.length) {
short[] newdata = new short[data.length + 4]; short[] newdata = new short[data.length + 4];
System.arraycopy(data, 0, newdata, 0, size); 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) { public String[] convertFrom(R in, DeMember member) {
int len = in.readArrayB(member, null, StringSimpledCoder.instance); int len = in.readArrayB(member, StringSimpledCoder.instance);
int contentLength = -1;
if (len == Reader.SIGN_NULL) { if (len == Reader.SIGN_NULL) {
return null; return null;
} }
if (len == Reader.SIGN_NOLENBUTBYTES) { if (len == Reader.SIGN_VARIABLE) {
contentLength = in.readMemberContentLength(null, StringSimpledCoder.instance);
len = Reader.SIGN_NOLENGTH;
}
if (len == Reader.SIGN_NOLENGTH) {
int size = 0; int size = 0;
String[] data = new String[8]; String[] data = new String[8];
int startPosition = in.position(); while (in.hasNext()) {
while (in.hasNext(startPosition, contentLength)) {
if (size >= data.length) { if (size >= data.length) {
String[] newdata = new String[data.length + 4]; String[] newdata = new String[data.length + 4];
System.arraycopy(data, 0, newdata, 0, size); 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 @Override
public final String readObjectB(final Class clazz) { public final String readObjectB(final Class clazz) {
@@ -181,15 +181,14 @@ public class JsonByteBufferReader extends JsonReader {
* 判断下一个非空白字符是否为[ * 判断下一个非空白字符是否为[
* *
* @param member DeMember * @param member DeMember
* @param typevals byte[]
* @param decoder Decodeable * @param decoder Decodeable
* @return SIGN_NOLENGTH 或 SIGN_NULL * @return SIGN_VARIABLE 或 SIGN_NULL
*/ */
@Override @Override
public final int readArrayB(DeMember member, byte[] typevals, Decodeable decoder) { public final int readArrayB(DeMember member, Decodeable decoder) {
char ch = nextGoodChar(true); char ch = nextGoodChar(true);
if (ch == '[' || ch == '{') { if (ch == '[' || ch == '{') {
return SIGN_NOLENGTH; return SIGN_VARIABLE;
} }
if (ch == 'n' && nextChar() == 'u' && nextChar() == 'l' && nextChar() == 'l') { if (ch == 'n' && nextChar() == 'u' && nextChar() == 'l' && nextChar() == 'l') {
return SIGN_NULL; return SIGN_NULL;

View File

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

View File

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

View File

@@ -6,6 +6,7 @@
package org.redkale.convert.pb; package org.redkale.convert.pb;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.*;
import org.redkale.convert.*; import org.redkale.convert.*;
/** /**
@@ -24,6 +25,27 @@ public class ProtobufArrayDecoder<T> extends ArrayDecoder<ProtobufReader, T> {
} }
@Override @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) { protected ProtobufReader getItemReader(ProtobufReader in, DeMember member, boolean first) {
return ProtobufFactory.getItemReader(in, member, componentSimpled, first); return ProtobufFactory.getItemReader(in, member, componentSimpled, first);
} }

View File

@@ -6,6 +6,7 @@
package org.redkale.convert.pb; package org.redkale.convert.pb;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.Collection;
import org.redkale.convert.*; import org.redkale.convert.*;
/** /**
@@ -22,6 +23,26 @@ public class ProtobufCollectionDecoder<T> extends CollectionDecoder<ProtobufRead
} }
@Override @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) { protected ProtobufReader getItemReader(ProtobufReader in, DeMember member, boolean first) {
return ProtobufFactory.getItemReader(in, member, componentSimpled, first); return ProtobufFactory.getItemReader(in, member, componentSimpled, first);
} }

View File

@@ -6,6 +6,7 @@
package org.redkale.convert.pb; package org.redkale.convert.pb;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.Map;
import org.redkale.convert.*; import org.redkale.convert.*;
/** /**
@@ -23,6 +24,29 @@ public class ProtobufMapDecoder<K, V> extends MapDecoder<ProtobufReader, K, V> {
} }
@Override @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) { protected ProtobufReader getEntryReader(ProtobufReader in, DeMember member, boolean first) {
if (!first && member != null) { if (!first && member != null) {
int tag = in.readTag(); int tag = in.readTag();
@@ -34,18 +58,4 @@ public class ProtobufMapDecoder<K, V> extends MapDecoder<ProtobufReader, K, V> {
byte[] bs = in.readByteArray(); byte[] bs = in.readByteArray();
return new ProtobufReader(bs); 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); V v = mapFieldFunc == null ? val : mapFieldFunc.apply(key, val);
if (v != null) { if (v != null) {
out.writeFieldName(member); out.writeFieldName(member);
ProtobufWriter tmp = out.pollChild(); ProtobufWriter tmp = out.pollChild();
tmp.writeTag(keyTag); tmp.writeTag(keyTag);
kencoder.convertTo(tmp, key); kencoder.convertTo(tmp, key);
tmp.writeTag(valTag); tmp.writeTag(valTag);
vencoder.convertTo(tmp, v); vencoder.convertTo(tmp, v);
out.writeLength(tmp.count()); out.writeLength(tmp.count());
out.writeTo(tmp.toArray()); out.writeTo(tmp.toArray());
out.offerChild(tmp); out.offerChild(tmp);

View File

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

View File

@@ -6,6 +6,8 @@
package org.redkale.convert.pb; package org.redkale.convert.pb;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.*;
import java.util.stream.Stream;
import org.redkale.convert.*; import org.redkale.convert.*;
/** /**
@@ -22,6 +24,26 @@ public class ProtobufStreamDecoder<T> extends StreamDecoder<ProtobufReader, T> {
} }
@Override @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) { protected ProtobufReader getItemReader(ProtobufReader in, DeMember member, boolean first) {
return ProtobufFactory.getItemReader(in, member, componentSimpled, first); return ProtobufFactory.getItemReader(in, member, componentSimpled, first);
} }

View File

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