convert优化
This commit is contained in:
@@ -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:"
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
46
src/main/java/org/redkale/convert/bson/BsonArrayDecoder.java
Normal file
46
src/main/java/org/redkale/convert/bson/BsonArrayDecoder.java
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
48
src/main/java/org/redkale/convert/bson/BsonMapDecoder.java
Normal file
48
src/main/java/org/redkale/convert/bson/BsonMapDecoder.java
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user