TagDecodeable
This commit is contained in:
@@ -23,7 +23,7 @@ import org.redkale.util.Creator;
|
|||||||
* @param <T> 反解析的数组元素类型
|
* @param <T> 反解析的数组元素类型
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public class ArrayDecoder<R extends Reader, T> implements Decodeable<R, T[]> {
|
public class ArrayDecoder<R extends Reader, T> implements TagDecodeable<R, T[]> {
|
||||||
|
|
||||||
protected final Type type;
|
protected final Type type;
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ import org.redkale.util.Creator;
|
|||||||
* @param <T> 反解析的集合元素类型
|
* @param <T> 反解析的集合元素类型
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public class CollectionDecoder<R extends Reader, T> implements Decodeable<R, Collection<T>> {
|
public class CollectionDecoder<R extends Reader, T> implements TagDecodeable<R, Collection<T>> {
|
||||||
|
|
||||||
protected final Type type;
|
protected final Type type;
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ import org.redkale.util.Creator;
|
|||||||
* @param <V> Map value的数据类型
|
* @param <V> Map value的数据类型
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public class MapDecoder<R extends Reader, K, V> implements Decodeable<R, Map<K, V>> {
|
public class MapDecoder<R extends Reader, K, V> implements TagDecodeable<R, Map<K, V>> {
|
||||||
|
|
||||||
protected final Type type;
|
protected final Type type;
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ import java.util.stream.Stream;
|
|||||||
* @param <T> 反解析的集合元素类型
|
* @param <T> 反解析的集合元素类型
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public class StreamDecoder<R extends Reader, T> implements Decodeable<R, Stream<T>> {
|
public class StreamDecoder<R extends Reader, T> implements TagDecodeable<R, Stream<T>> {
|
||||||
|
|
||||||
protected final Type type;
|
protected final Type type;
|
||||||
|
|
||||||
|
|||||||
25
src/main/java/org/redkale/convert/TagDecodeable.java
Normal file
25
src/main/java/org/redkale/convert/TagDecodeable.java
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2116 Redkale
|
||||||
|
* All rights reserved.
|
||||||
|
*/
|
||||||
|
package org.redkale.convert;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 带tag的反序列化操作类
|
||||||
|
*
|
||||||
|
* <p>详情见: https://redkale.org
|
||||||
|
*
|
||||||
|
* @author zhangjx
|
||||||
|
* @param <R> Reader输入的子类
|
||||||
|
* @param <T> 反解析的数据类型
|
||||||
|
*/
|
||||||
|
public interface TagDecodeable<R extends Reader, T> extends Decodeable<R, T> {
|
||||||
|
/**
|
||||||
|
* 反序列化操作
|
||||||
|
*
|
||||||
|
* @param in R
|
||||||
|
* @param member DeMember
|
||||||
|
* @return T
|
||||||
|
*/
|
||||||
|
public T convertFrom(final R in, DeMember member);
|
||||||
|
}
|
||||||
@@ -6,7 +6,6 @@
|
|||||||
package org.redkale.convert.pb;
|
package org.redkale.convert.pb;
|
||||||
|
|
||||||
import java.lang.reflect.Type;
|
import java.lang.reflect.Type;
|
||||||
import java.util.concurrent.atomic.*;
|
|
||||||
import org.redkale.convert.*;
|
import org.redkale.convert.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -26,15 +25,7 @@ public class ProtobufArrayDecoder<T> extends ArrayDecoder<ProtobufReader, T> {
|
|||||||
this.enumtostring = factory.enumtostring;
|
this.enumtostring = factory.enumtostring;
|
||||||
Type comtype = this.getComponentType();
|
Type comtype = this.getComponentType();
|
||||||
this.string = String.class == comtype;
|
this.string = String.class == comtype;
|
||||||
this.simple = Boolean.class == comtype
|
this.simple = ProtobufFactory.isNoLenBytesType(comtype);
|
||||||
|| Short.class == comtype
|
|
||||||
|| Character.class == comtype
|
|
||||||
|| Integer.class == comtype
|
|
||||||
|| Float.class == comtype
|
|
||||||
|| Long.class == comtype
|
|
||||||
|| Double.class == comtype
|
|
||||||
|| AtomicInteger.class == comtype
|
|
||||||
|| AtomicLong.class == comtype;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -6,7 +6,6 @@
|
|||||||
package org.redkale.convert.pb;
|
package org.redkale.convert.pb;
|
||||||
|
|
||||||
import java.lang.reflect.Type;
|
import java.lang.reflect.Type;
|
||||||
import java.util.concurrent.atomic.*;
|
|
||||||
import org.redkale.convert.*;
|
import org.redkale.convert.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -19,16 +18,7 @@ public class ProtobufArrayEncoder<T> extends ArrayEncoder<ProtobufWriter, T> {
|
|||||||
|
|
||||||
public ProtobufArrayEncoder(ProtobufFactory factory, Type type) {
|
public ProtobufArrayEncoder(ProtobufFactory factory, Type type) {
|
||||||
super(factory, type);
|
super(factory, type);
|
||||||
Type comtype = this.getComponentType();
|
this.simple = ProtobufFactory.isNoLenBytesType(getComponentType());
|
||||||
this.simple = Boolean.class == comtype
|
|
||||||
|| Short.class == comtype
|
|
||||||
|| Character.class == comtype
|
|
||||||
|| Integer.class == comtype
|
|
||||||
|| Float.class == comtype
|
|
||||||
|| Long.class == comtype
|
|
||||||
|| Double.class == comtype
|
|
||||||
|| AtomicInteger.class == comtype
|
|
||||||
|| AtomicLong.class == comtype;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -6,7 +6,6 @@
|
|||||||
package org.redkale.convert.pb;
|
package org.redkale.convert.pb;
|
||||||
|
|
||||||
import java.lang.reflect.Type;
|
import java.lang.reflect.Type;
|
||||||
import java.util.concurrent.atomic.*;
|
|
||||||
import org.redkale.convert.*;
|
import org.redkale.convert.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -26,15 +25,7 @@ public class ProtobufCollectionDecoder<T> extends CollectionDecoder<ProtobufRead
|
|||||||
this.enumtostring = factory.enumtostring;
|
this.enumtostring = factory.enumtostring;
|
||||||
Type comtype = this.getComponentType();
|
Type comtype = this.getComponentType();
|
||||||
this.string = String.class == comtype;
|
this.string = String.class == comtype;
|
||||||
this.simple = Boolean.class == comtype
|
this.simple = ProtobufFactory.isNoLenBytesType(comtype);
|
||||||
|| Short.class == comtype
|
|
||||||
|| Character.class == comtype
|
|
||||||
|| Integer.class == comtype
|
|
||||||
|| Float.class == comtype
|
|
||||||
|| Long.class == comtype
|
|
||||||
|| Double.class == comtype
|
|
||||||
|| AtomicInteger.class == comtype
|
|
||||||
|| AtomicLong.class == comtype;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -6,7 +6,6 @@
|
|||||||
package org.redkale.convert.pb;
|
package org.redkale.convert.pb;
|
||||||
|
|
||||||
import java.lang.reflect.Type;
|
import java.lang.reflect.Type;
|
||||||
import java.util.concurrent.atomic.*;
|
|
||||||
import org.redkale.convert.*;
|
import org.redkale.convert.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -19,16 +18,7 @@ public class ProtobufCollectionEncoder<T> extends CollectionEncoder<ProtobufWrit
|
|||||||
|
|
||||||
public ProtobufCollectionEncoder(ProtobufFactory factory, Type type) {
|
public ProtobufCollectionEncoder(ProtobufFactory factory, Type type) {
|
||||||
super(factory, type);
|
super(factory, type);
|
||||||
Type comtype = this.getComponentType();
|
this.simple = ProtobufFactory.isNoLenBytesType(getComponentType());
|
||||||
this.simple = Boolean.class == comtype
|
|
||||||
|| Short.class == comtype
|
|
||||||
|| Character.class == comtype
|
|
||||||
|| Integer.class == comtype
|
|
||||||
|| Float.class == comtype
|
|
||||||
|| Long.class == comtype
|
|
||||||
|| Double.class == comtype
|
|
||||||
|| AtomicInteger.class == comtype
|
|
||||||
|| AtomicLong.class == comtype;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -214,6 +214,20 @@ public class ProtobufFactory extends ConvertFactory<ProtobufReader, ProtobufWrit
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected static boolean isNoLenBytesType(Type type) {
|
||||||
|
return (type instanceof Class && ((Class) type).isPrimitive())
|
||||||
|
|| type == Boolean.class
|
||||||
|
|| type == Byte.class
|
||||||
|
|| type == Short.class
|
||||||
|
|| type == Character.class
|
||||||
|
|| type == Integer.class
|
||||||
|
|| type == Float.class
|
||||||
|
|| type == Long.class
|
||||||
|
|| type == Double.class
|
||||||
|
|| type == AtomicInteger.class
|
||||||
|
|| type == AtomicLong.class;
|
||||||
|
}
|
||||||
|
|
||||||
public static int getTag(String fieldName, Type fieldType, int fieldPos, boolean enumtostring) {
|
public static int getTag(String fieldName, Type fieldType, int fieldPos, boolean enumtostring) {
|
||||||
int wiretype = ProtobufFactory.wireType(fieldType, enumtostring);
|
int wiretype = ProtobufFactory.wireType(fieldType, enumtostring);
|
||||||
return (fieldPos << 3 | wiretype);
|
return (fieldPos << 3 | wiretype);
|
||||||
|
|||||||
@@ -33,7 +33,9 @@ public class ProtobufObjectDecoder<T> extends ObjectDecoder<ProtobufReader, T> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected ProtobufReader objectReader(ProtobufReader in) {
|
protected ProtobufReader objectReader(ProtobufReader in) {
|
||||||
if (in.position() > in.initoffset) return new ProtobufReader(in.readByteArray());
|
if (in.position() > in.initoffset) {
|
||||||
|
return new ProtobufReader(in.readByteArray());
|
||||||
|
}
|
||||||
return in;
|
return in;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -45,14 +47,8 @@ public class ProtobufObjectDecoder<T> extends ObjectDecoder<ProtobufReader, T> {
|
|||||||
@Override
|
@Override
|
||||||
protected Object readDeMemberValue(ProtobufReader in, DeMember member, boolean first) {
|
protected Object readDeMemberValue(ProtobufReader in, DeMember member, boolean first) {
|
||||||
Decodeable decoder = member.getDecoder();
|
Decodeable decoder = member.getDecoder();
|
||||||
if (decoder instanceof ProtobufArrayDecoder) {
|
if (decoder instanceof TagDecodeable) {
|
||||||
return ((ProtobufArrayDecoder) decoder).convertFrom(in, member);
|
return ((TagDecodeable) decoder).convertFrom(in, member);
|
||||||
} else if (decoder instanceof ProtobufCollectionDecoder) {
|
|
||||||
return ((ProtobufCollectionDecoder) decoder).convertFrom(in, member);
|
|
||||||
} else if (decoder instanceof ProtobufStreamDecoder) {
|
|
||||||
return ((ProtobufStreamDecoder) decoder).convertFrom(in, member);
|
|
||||||
} else if (decoder instanceof ProtobufMapDecoder) {
|
|
||||||
return ((ProtobufMapDecoder) decoder).convertFrom(in, member);
|
|
||||||
} else {
|
} else {
|
||||||
return member.read(in);
|
return member.read(in);
|
||||||
}
|
}
|
||||||
@@ -61,14 +57,8 @@ public class ProtobufObjectDecoder<T> extends ObjectDecoder<ProtobufReader, T> {
|
|||||||
@Override
|
@Override
|
||||||
protected void readDeMemberValue(ProtobufReader in, DeMember member, T result, boolean first) {
|
protected void readDeMemberValue(ProtobufReader in, DeMember member, T result, boolean first) {
|
||||||
Decodeable decoder = member.getDecoder();
|
Decodeable decoder = member.getDecoder();
|
||||||
if (decoder instanceof ProtobufArrayDecoder) {
|
if (decoder instanceof TagDecodeable) {
|
||||||
member.getAttribute().set(result, ((ProtobufArrayDecoder) decoder).convertFrom(in, member));
|
member.getAttribute().set(result, ((TagDecodeable) decoder).convertFrom(in, member));
|
||||||
} else if (decoder instanceof ProtobufCollectionDecoder) {
|
|
||||||
member.getAttribute().set(result, ((ProtobufCollectionDecoder) decoder).convertFrom(in, member));
|
|
||||||
} else if (decoder instanceof ProtobufStreamDecoder) {
|
|
||||||
member.getAttribute().set(result, ((ProtobufStreamDecoder) decoder).convertFrom(in, member));
|
|
||||||
} else if (decoder instanceof ProtobufMapDecoder) {
|
|
||||||
member.getAttribute().set(result, ((ProtobufMapDecoder) decoder).convertFrom(in, member));
|
|
||||||
} else {
|
} else {
|
||||||
member.read(in, result);
|
member.read(in, result);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ package org.redkale.convert.pb;
|
|||||||
import java.lang.reflect.Type;
|
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 org.redkale.convert.*;
|
import org.redkale.convert.*;
|
||||||
|
|
||||||
/** @author zhangjx */
|
/** @author zhangjx */
|
||||||
@@ -20,7 +19,7 @@ public class ProtobufReader extends Reader {
|
|||||||
|
|
||||||
private byte[] content;
|
private byte[] content;
|
||||||
|
|
||||||
protected int cachetag = Integer.MIN_VALUE;
|
protected int cacheTag = Integer.MIN_VALUE;
|
||||||
|
|
||||||
protected boolean enumtostring;
|
protected boolean enumtostring;
|
||||||
|
|
||||||
@@ -106,6 +105,8 @@ public class ProtobufReader extends Reader {
|
|||||||
case 5:
|
case 5:
|
||||||
readRawLittleEndian32();
|
readRawLittleEndian32();
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -146,18 +147,7 @@ public class ProtobufReader extends Reader {
|
|||||||
if (!(type instanceof Class)) {
|
if (!(type instanceof Class)) {
|
||||||
return Reader.SIGN_NOLENBUTBYTES;
|
return Reader.SIGN_NOLENBUTBYTES;
|
||||||
}
|
}
|
||||||
Class clazz = (Class) type;
|
if (ProtobufFactory.isNoLenBytesType(type)) {
|
||||||
if (clazz.isPrimitive()
|
|
||||||
|| clazz == Boolean.class
|
|
||||||
|| clazz == Byte.class
|
|
||||||
|| clazz == Short.class
|
|
||||||
|| clazz == Character.class
|
|
||||||
|| clazz == Integer.class
|
|
||||||
|| clazz == Float.class
|
|
||||||
|| clazz == Long.class
|
|
||||||
|| clazz == Double.class
|
|
||||||
|| clazz == AtomicInteger.class
|
|
||||||
|| clazz == AtomicLong.class) {
|
|
||||||
return Reader.SIGN_NOLENBUTBYTES;
|
return Reader.SIGN_NOLENBUTBYTES;
|
||||||
}
|
}
|
||||||
return Reader.SIGN_NOLENGTH;
|
return Reader.SIGN_NOLENGTH;
|
||||||
@@ -276,16 +266,16 @@ public class ProtobufReader extends Reader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected final int readTag() {
|
protected final int readTag() {
|
||||||
if (cachetag != Integer.MIN_VALUE) {
|
if (cacheTag != Integer.MIN_VALUE) {
|
||||||
int tag = cachetag;
|
int tag = cacheTag;
|
||||||
cachetag = Integer.MIN_VALUE;
|
cacheTag = Integer.MIN_VALUE;
|
||||||
return tag;
|
return tag;
|
||||||
}
|
}
|
||||||
return readRawVarint32();
|
return readRawVarint32();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final void backTag(int tag) {
|
protected final void backTag(int tag) {
|
||||||
this.cachetag = tag;
|
this.cacheTag = tag;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected byte currentByte() {
|
protected byte currentByte() {
|
||||||
|
|||||||
@@ -6,7 +6,6 @@
|
|||||||
package org.redkale.convert.pb;
|
package org.redkale.convert.pb;
|
||||||
|
|
||||||
import java.lang.reflect.Type;
|
import java.lang.reflect.Type;
|
||||||
import java.util.concurrent.atomic.*;
|
|
||||||
import org.redkale.convert.*;
|
import org.redkale.convert.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -26,15 +25,7 @@ public class ProtobufStreamDecoder<T> extends StreamDecoder<ProtobufReader, T> {
|
|||||||
this.enumtostring = ((ProtobufFactory) factory).enumtostring;
|
this.enumtostring = ((ProtobufFactory) factory).enumtostring;
|
||||||
Type comtype = this.getComponentType();
|
Type comtype = this.getComponentType();
|
||||||
this.string = String.class == comtype;
|
this.string = String.class == comtype;
|
||||||
this.simple = Boolean.class == comtype
|
this.simple = ProtobufFactory.isNoLenBytesType(comtype);
|
||||||
|| Short.class == comtype
|
|
||||||
|| Character.class == comtype
|
|
||||||
|| Integer.class == comtype
|
|
||||||
|| Float.class == comtype
|
|
||||||
|| Long.class == comtype
|
|
||||||
|| Double.class == comtype
|
|
||||||
|| AtomicInteger.class == comtype
|
|
||||||
|| AtomicLong.class == comtype;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -6,7 +6,6 @@
|
|||||||
package org.redkale.convert.pb;
|
package org.redkale.convert.pb;
|
||||||
|
|
||||||
import java.lang.reflect.Type;
|
import java.lang.reflect.Type;
|
||||||
import java.util.concurrent.atomic.*;
|
|
||||||
import org.redkale.convert.*;
|
import org.redkale.convert.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -19,16 +18,7 @@ public class ProtobufStreamEncoder<T> extends StreamEncoder<ProtobufWriter, T> {
|
|||||||
|
|
||||||
public ProtobufStreamEncoder(ConvertFactory factory, Type type) {
|
public ProtobufStreamEncoder(ConvertFactory factory, Type type) {
|
||||||
super(factory, type);
|
super(factory, type);
|
||||||
Type comtype = this.getComponentType();
|
this.simple = ProtobufFactory.isNoLenBytesType(getComponentType());
|
||||||
this.simple = Boolean.class == comtype
|
|
||||||
|| Short.class == comtype
|
|
||||||
|| Character.class == comtype
|
|
||||||
|| Integer.class == comtype
|
|
||||||
|| Float.class == comtype
|
|
||||||
|| Long.class == comtype
|
|
||||||
|| Double.class == comtype
|
|
||||||
|| AtomicInteger.class == comtype
|
|
||||||
|| AtomicLong.class == comtype;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user