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);
|
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:"
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
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;
|
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
|
||||||
|
|||||||
@@ -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 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;
|
||||||
|
|||||||
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 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
|
||||||
|
|||||||
@@ -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
|
@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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user