convert
This commit is contained in:
@@ -71,22 +71,7 @@ public class ArrayDecoder<R extends Reader, T> implements TagDecodeable<R, T[]>
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public T[] convertFrom(R in) {
|
||||
return convertFrom(in, null);
|
||||
}
|
||||
|
||||
public T[] convertFrom(R in, DeMember member) {
|
||||
byte[] typevals = new byte[1];
|
||||
int len = in.readArrayB(member, typevals, componentDecoder);
|
||||
int contentLength = -1;
|
||||
if (len == Reader.SIGN_NULL) {
|
||||
return null;
|
||||
}
|
||||
if (len == Reader.SIGN_NOLENBUTBYTES) {
|
||||
contentLength = in.readMemberContentLength(member, componentDecoder);
|
||||
len = Reader.SIGN_NOLENGTH;
|
||||
}
|
||||
protected void checkInited() {
|
||||
if (this.componentDecoder == null) {
|
||||
if (!this.inited) {
|
||||
lock.lock();
|
||||
@@ -99,6 +84,25 @@ public class ArrayDecoder<R extends Reader, T> implements TagDecodeable<R, T[]>
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public T[] convertFrom(R in) {
|
||||
return convertFrom(in, null);
|
||||
}
|
||||
|
||||
public 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) {
|
||||
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;
|
||||
|
||||
@@ -69,24 +69,8 @@ public class ArrayEncoder<W extends Writer, T> implements Encodeable<W, T[]> {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void convertTo(W out, T[] value) {
|
||||
convertTo(out, null, value);
|
||||
}
|
||||
|
||||
public void convertTo(W out, EnMember member, T[] value) {
|
||||
if (value == null) {
|
||||
out.writeNull();
|
||||
return;
|
||||
}
|
||||
int iMax = value.length - 1;
|
||||
if (iMax == -1) {
|
||||
out.writeArrayB(0, this, componentEncoder, value);
|
||||
out.writeArrayE();
|
||||
return;
|
||||
}
|
||||
Encodeable<W, Object> itemEncoder = this.componentEncoder;
|
||||
if (itemEncoder == null) {
|
||||
protected void checkInited() {
|
||||
if (this.componentEncoder == null) {
|
||||
if (!this.inited) {
|
||||
lock.lock();
|
||||
try {
|
||||
@@ -96,37 +80,54 @@ public class ArrayEncoder<W extends Writer, T> implements Encodeable<W, T[]> {
|
||||
} finally {
|
||||
lock.unlock();
|
||||
}
|
||||
itemEncoder = this.componentEncoder;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void convertTo(W out, T[] value) {
|
||||
convertTo(out, null, value);
|
||||
}
|
||||
|
||||
public void convertTo(W out, EnMember member, T[] value) {
|
||||
this.checkInited();
|
||||
if (value == null) {
|
||||
out.writeNull();
|
||||
return;
|
||||
}
|
||||
int iMax = value.length - 1;
|
||||
if (iMax == -1) {
|
||||
out.writeArrayB(0, componentEncoder, value);
|
||||
out.writeArrayE();
|
||||
return;
|
||||
}
|
||||
Encodeable<W, Object> itemEncoder = this.componentEncoder;
|
||||
if (subTypeFinal) {
|
||||
if (out.writeArrayB(value.length, this, itemEncoder, value) < 0) {
|
||||
for (int i = 0; ; i++) {
|
||||
writeMemberValue(out, member, itemEncoder, value[i], i);
|
||||
if (i == iMax) {
|
||||
break;
|
||||
}
|
||||
out.writeArrayMark();
|
||||
out.writeArrayB(value.length, itemEncoder, value);
|
||||
for (int i = 0; ; i++) {
|
||||
writeMemberValue(out, member, itemEncoder, value[i], i);
|
||||
if (i == iMax) {
|
||||
break;
|
||||
}
|
||||
out.writeArrayMark();
|
||||
}
|
||||
} else {
|
||||
if (out.writeArrayB(value.length, this, itemEncoder, value) < 0) {
|
||||
final Type comp = this.componentType;
|
||||
for (int i = 0; ; i++) {
|
||||
Object v = value[i];
|
||||
writeMemberValue(
|
||||
out,
|
||||
member,
|
||||
((v != null && (v.getClass() == comp || out.specificObjectType() == comp))
|
||||
? itemEncoder
|
||||
: anyEncoder),
|
||||
v,
|
||||
i);
|
||||
if (i == iMax) {
|
||||
break;
|
||||
}
|
||||
out.writeArrayMark();
|
||||
out.writeArrayB(value.length, itemEncoder, value);
|
||||
final Type comp = this.componentType;
|
||||
for (int i = 0; ; i++) {
|
||||
Object v = value[i];
|
||||
writeMemberValue(
|
||||
out,
|
||||
member,
|
||||
((v != null && (v.getClass() == comp || out.specificObjectType() == comp))
|
||||
? itemEncoder
|
||||
: anyEncoder),
|
||||
v,
|
||||
i);
|
||||
if (i == iMax) {
|
||||
break;
|
||||
}
|
||||
out.writeArrayMark();
|
||||
}
|
||||
}
|
||||
out.writeArrayE();
|
||||
|
||||
@@ -76,22 +76,7 @@ public class CollectionDecoder<R extends Reader, T> implements TagDecodeable<R,
|
||||
this.inited = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<T> convertFrom(R in) {
|
||||
return convertFrom(in, null);
|
||||
}
|
||||
|
||||
public Collection<T> convertFrom(R in, DeMember member) {
|
||||
byte[] typevals = new byte[1];
|
||||
int len = in.readArrayB(member, typevals, componentDecoder);
|
||||
int contentLength = -1;
|
||||
if (len == Reader.SIGN_NULL) {
|
||||
return null;
|
||||
}
|
||||
if (len == Reader.SIGN_NOLENBUTBYTES) {
|
||||
contentLength = in.readMemberContentLength(member, componentDecoder);
|
||||
len = Reader.SIGN_NOLENGTH;
|
||||
}
|
||||
protected void checkInited() {
|
||||
if (this.componentDecoder == null) {
|
||||
if (!this.inited) {
|
||||
lock.lock();
|
||||
@@ -104,6 +89,25 @@ public class CollectionDecoder<R extends Reader, T> implements TagDecodeable<R,
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<T> convertFrom(R in) {
|
||||
return convertFrom(in, null);
|
||||
}
|
||||
|
||||
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) {
|
||||
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;
|
||||
|
||||
@@ -56,21 +56,7 @@ public class CollectionEncoder<W extends Writer, T> implements Encodeable<W, Col
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void convertTo(W out, Collection<T> value) {
|
||||
convertTo(out, null, value);
|
||||
}
|
||||
|
||||
public void convertTo(W out, EnMember member, Collection<T> value) {
|
||||
if (value == null) {
|
||||
out.writeNull();
|
||||
return;
|
||||
}
|
||||
if (value.isEmpty()) {
|
||||
out.writeArrayB(0, this, componentEncoder, value);
|
||||
out.writeArrayE();
|
||||
return;
|
||||
}
|
||||
protected void checkInited() {
|
||||
if (this.componentEncoder == null) {
|
||||
if (!this.inited) {
|
||||
lock.lock();
|
||||
@@ -83,16 +69,33 @@ public class CollectionEncoder<W extends Writer, T> implements Encodeable<W, Col
|
||||
}
|
||||
}
|
||||
}
|
||||
if (out.writeArrayB(value.size(), this, componentEncoder, value) < 0) {
|
||||
boolean first = true;
|
||||
for (Object v : value) {
|
||||
if (!first) {
|
||||
out.writeArrayMark();
|
||||
}
|
||||
writeMemberValue(out, member, v, first);
|
||||
if (first) {
|
||||
first = false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void convertTo(W out, Collection<T> value) {
|
||||
convertTo(out, null, value);
|
||||
}
|
||||
|
||||
public void convertTo(W out, EnMember member, Collection<T> value) {
|
||||
this.checkInited();
|
||||
if (value == null) {
|
||||
out.writeNull();
|
||||
return;
|
||||
}
|
||||
if (value.isEmpty()) {
|
||||
out.writeArrayB(0, componentEncoder, value);
|
||||
out.writeArrayE();
|
||||
return;
|
||||
}
|
||||
out.writeArrayB(value.size(), componentEncoder, value);
|
||||
boolean first = true;
|
||||
for (Object v : value) {
|
||||
if (!first) {
|
||||
out.writeArrayMark();
|
||||
}
|
||||
writeMemberValue(out, member, v, first);
|
||||
if (first) {
|
||||
first = false;
|
||||
}
|
||||
}
|
||||
out.writeArrayE();
|
||||
|
||||
@@ -98,12 +98,7 @@ public class MapDecoder<R extends Reader, K, V> implements TagDecodeable<R, Map<
|
||||
this.inited = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<K, V> convertFrom(R in) {
|
||||
return convertFrom(in, null);
|
||||
}
|
||||
|
||||
public Map<K, V> convertFrom(R in, DeMember member) {
|
||||
protected void checkInited() {
|
||||
if (this.keyDecoder == null || this.valueDecoder == null) {
|
||||
if (!this.inited) {
|
||||
lock.lock();
|
||||
@@ -116,6 +111,16 @@ public class MapDecoder<R extends Reader, K, V> implements TagDecodeable<R, Map<
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<K, V> convertFrom(R in) {
|
||||
return convertFrom(in, null);
|
||||
}
|
||||
|
||||
@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;
|
||||
|
||||
@@ -66,18 +66,7 @@ public class MapEncoder<W extends Writer, K, V> implements Encodeable<W, Map<K,
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void convertTo(W out, Map<K, V> value) {
|
||||
convertTo(out, null, value);
|
||||
}
|
||||
|
||||
public void convertTo(W out, EnMember member, Map<K, V> value) {
|
||||
final Map<K, V> values = value;
|
||||
if (values == null) {
|
||||
out.writeNull();
|
||||
return;
|
||||
}
|
||||
|
||||
protected void checkInited() {
|
||||
if (this.keyEncoder == null || this.valueEncoder == null) {
|
||||
if (!this.inited) {
|
||||
lock.lock();
|
||||
@@ -90,22 +79,35 @@ public class MapEncoder<W extends Writer, K, V> implements Encodeable<W, Map<K,
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void convertTo(W out, Map<K, V> value) {
|
||||
convertTo(out, null, value);
|
||||
}
|
||||
|
||||
public void convertTo(W out, EnMember member, Map<K, V> value) {
|
||||
this.checkInited();
|
||||
final Map<K, V> values = value;
|
||||
if (values == null) {
|
||||
out.writeNull();
|
||||
return;
|
||||
}
|
||||
Set<String> ignoreColumns = this.ignoreMapColumns;
|
||||
BiFunction<K, V, V> mapFieldFunc = (BiFunction) out.mapFieldFunc;
|
||||
if (out.writeMapB(values.size(), (Encodeable) keyEncoder, (Encodeable) valueEncoder, value) < 0) {
|
||||
boolean first = true;
|
||||
for (Map.Entry<K, V> en : values.entrySet()) {
|
||||
if (ignoreColumns != null && ignoreColumns.contains(en.getKey())) {
|
||||
continue;
|
||||
}
|
||||
V v = mapFieldFunc == null ? en.getValue() : mapFieldFunc.apply(en.getKey(), en.getValue());
|
||||
if (!first) {
|
||||
out.writeArrayMark();
|
||||
}
|
||||
writeMemberValue(out, member, en.getKey(), v, first);
|
||||
if (first) {
|
||||
first = false;
|
||||
}
|
||||
out.writeMapB(values.size(), (Encodeable) keyEncoder, (Encodeable) valueEncoder, value);
|
||||
boolean first = true;
|
||||
for (Map.Entry<K, V> en : values.entrySet()) {
|
||||
if (ignoreColumns != null && ignoreColumns.contains(en.getKey())) {
|
||||
continue;
|
||||
}
|
||||
V v = mapFieldFunc == null ? en.getValue() : mapFieldFunc.apply(en.getKey(), en.getValue());
|
||||
if (!first) {
|
||||
out.writeArrayMark();
|
||||
}
|
||||
writeMemberValue(out, member, en.getKey(), v, first);
|
||||
if (first) {
|
||||
first = false;
|
||||
}
|
||||
}
|
||||
out.writeMapE();
|
||||
|
||||
@@ -7,8 +7,7 @@ package org.redkale.convert;
|
||||
|
||||
import java.lang.reflect.*;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.locks.Condition;
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
import java.util.concurrent.locks.*;
|
||||
import org.redkale.annotation.Nullable;
|
||||
import org.redkale.convert.ext.StringSimpledCoder;
|
||||
import org.redkale.util.*;
|
||||
@@ -338,22 +337,7 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
|
||||
this.memberInfo = DeMemberInfo.create(deMembers);
|
||||
}
|
||||
|
||||
/**
|
||||
* 对象格式: [0x1][short字段个数][字段名][字段值]...[0x2]
|
||||
*
|
||||
* @param in 输入流
|
||||
* @return 反解析后的对象结果
|
||||
*/
|
||||
@Override
|
||||
public T convertFrom(final R in) {
|
||||
R objin = objectReader(in);
|
||||
final String clazz = objin.readObjectB(typeClass);
|
||||
if (clazz == null) {
|
||||
return null;
|
||||
}
|
||||
if (!clazz.isEmpty()) {
|
||||
return (T) factory.loadDecoder(factory.getEntityAlias(clazz)).convertFrom(objin);
|
||||
}
|
||||
protected void checkInited() {
|
||||
if (!this.inited) {
|
||||
lock.lock();
|
||||
try {
|
||||
@@ -364,6 +348,25 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
|
||||
lock.unlock();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 对象格式: [0x1][short字段个数][字段名][字段值]...[0x2]
|
||||
*
|
||||
* @param in 输入流
|
||||
* @return 反解析后的对象结果
|
||||
*/
|
||||
@Override
|
||||
public T convertFrom(final R in) {
|
||||
this.checkInited();
|
||||
R objin = objectReader(in);
|
||||
final String clazz = objin.readObjectB(typeClass);
|
||||
if (clazz == null) {
|
||||
return null;
|
||||
}
|
||||
if (!clazz.isEmpty()) {
|
||||
return (T) factory.loadDecoder(factory.getEntityAlias(clazz)).convertFrom(objin);
|
||||
}
|
||||
if (this.creator == null) {
|
||||
if (typeClass.isInterface() || Modifier.isAbstract(typeClass.getModifiers())) {
|
||||
throw new ConvertException(
|
||||
|
||||
@@ -9,7 +9,7 @@ import java.lang.reflect.*;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.locks.*;
|
||||
import org.redkale.annotation.ConstructorParameters;
|
||||
import org.redkale.annotation.Nullable;
|
||||
import org.redkale.annotation.*;
|
||||
import org.redkale.convert.ext.StringSimpledCoder;
|
||||
import org.redkale.util.*;
|
||||
|
||||
@@ -309,12 +309,7 @@ public class ObjectEncoder<W extends Writer, T> implements Encodeable<W, T> {
|
||||
this.members = enMembers;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void convertTo(W out, T value) {
|
||||
if (value == null) {
|
||||
out.writeObjectNull(null);
|
||||
return;
|
||||
}
|
||||
protected void checkInited() {
|
||||
if (!this.inited) {
|
||||
lock.lock();
|
||||
try {
|
||||
@@ -325,6 +320,15 @@ public class ObjectEncoder<W extends Writer, T> implements Encodeable<W, T> {
|
||||
lock.unlock();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void convertTo(W out, T value) {
|
||||
this.checkInited();
|
||||
if (value == null) {
|
||||
out.writeObjectNull(null);
|
||||
return;
|
||||
}
|
||||
if (value.getClass() != this.typeClass && !this.type.equals(out.specificObjectType())) {
|
||||
final Class clz = value.getClass();
|
||||
if (out.needWriteClassName()) {
|
||||
@@ -334,28 +338,27 @@ public class ObjectEncoder<W extends Writer, T> implements Encodeable<W, T> {
|
||||
return;
|
||||
}
|
||||
W objout = objectWriter(out, value);
|
||||
if (objout.writeObjectB(value) < 0) {
|
||||
int maxPosition = 0;
|
||||
for (EnMember member : members) {
|
||||
maxPosition = member.getPosition();
|
||||
objout.writeObjectField(member, value);
|
||||
}
|
||||
if (objout.objExtFunc != null) {
|
||||
ConvertField[] extFields = objout.objExtFunc.apply(value);
|
||||
if (extFields != null) {
|
||||
Encodeable<W, ?> anyEncoder = factory.getAnyEncoder();
|
||||
for (ConvertField en : extFields) {
|
||||
if (en == null) {
|
||||
continue;
|
||||
}
|
||||
maxPosition++;
|
||||
objout.writeObjectField(
|
||||
en.getName(),
|
||||
en.getType(),
|
||||
Math.max(en.getPosition(), maxPosition),
|
||||
anyEncoder,
|
||||
en.getValue());
|
||||
objout.writeObjectB(value);
|
||||
int maxPosition = 0;
|
||||
for (EnMember member : members) {
|
||||
maxPosition = member.getPosition();
|
||||
objout.writeObjectField(member, value);
|
||||
}
|
||||
if (objout.objExtFunc != null) {
|
||||
ConvertField[] extFields = objout.objExtFunc.apply(value);
|
||||
if (extFields != null) {
|
||||
Encodeable<W, ?> anyEncoder = factory.getAnyEncoder();
|
||||
for (ConvertField en : extFields) {
|
||||
if (en == null) {
|
||||
continue;
|
||||
}
|
||||
maxPosition++;
|
||||
objout.writeObjectField(
|
||||
en.getName(),
|
||||
en.getType(),
|
||||
Math.max(en.getPosition(), maxPosition),
|
||||
anyEncoder,
|
||||
en.getValue());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,22 +57,7 @@ public class StreamDecoder<R extends Reader, T> implements TagDecodeable<R, Stre
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Stream<T> convertFrom(R in) {
|
||||
return convertFrom(in, null);
|
||||
}
|
||||
|
||||
public Stream<T> convertFrom(R in, DeMember member) {
|
||||
byte[] typevals = new byte[1];
|
||||
int len = in.readArrayB(member, typevals, this.componentDecoder);
|
||||
int contentLength = -1;
|
||||
if (len == Reader.SIGN_NULL) {
|
||||
return null;
|
||||
}
|
||||
if (len == Reader.SIGN_NOLENBUTBYTES) {
|
||||
contentLength = in.readMemberContentLength(member, this.componentDecoder);
|
||||
len = Reader.SIGN_NOLENGTH;
|
||||
}
|
||||
protected void checkInited() {
|
||||
if (this.componentDecoder == null) {
|
||||
if (!this.inited) {
|
||||
lock.lock();
|
||||
@@ -85,6 +70,25 @@ public class StreamDecoder<R extends Reader, T> implements TagDecodeable<R, Stre
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Stream<T> convertFrom(R in) {
|
||||
return convertFrom(in, null);
|
||||
}
|
||||
|
||||
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;
|
||||
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;
|
||||
|
||||
@@ -56,22 +56,7 @@ public class StreamEncoder<W extends Writer, T> implements Encodeable<W, Stream<
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void convertTo(W out, Stream<T> value) {
|
||||
convertTo(out, null, value);
|
||||
}
|
||||
|
||||
public void convertTo(W out, EnMember member, Stream<T> value) {
|
||||
if (value == null) {
|
||||
out.writeNull();
|
||||
return;
|
||||
}
|
||||
Object[] array = value.toArray();
|
||||
if (array.length == 0) {
|
||||
out.writeArrayB(0, this, componentEncoder, array);
|
||||
out.writeArrayE();
|
||||
return;
|
||||
}
|
||||
protected void checkInited() {
|
||||
if (this.componentEncoder == null) {
|
||||
if (!this.inited) {
|
||||
lock.lock();
|
||||
@@ -84,16 +69,34 @@ public class StreamEncoder<W extends Writer, T> implements Encodeable<W, Stream<
|
||||
}
|
||||
}
|
||||
}
|
||||
if (out.writeArrayB(array.length, this, componentEncoder, array) < 0) {
|
||||
boolean first = true;
|
||||
for (Object v : array) {
|
||||
if (!first) {
|
||||
out.writeArrayMark();
|
||||
}
|
||||
writeMemberValue(out, member, v, first);
|
||||
if (first) {
|
||||
first = false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void convertTo(W out, Stream<T> value) {
|
||||
convertTo(out, null, value);
|
||||
}
|
||||
|
||||
public void convertTo(W out, EnMember member, Stream<T> value) {
|
||||
this.checkInited();
|
||||
if (value == null) {
|
||||
out.writeNull();
|
||||
return;
|
||||
}
|
||||
Object[] array = value.toArray();
|
||||
if (array.length == 0) {
|
||||
out.writeArrayB(0, componentEncoder, array);
|
||||
out.writeArrayE();
|
||||
return;
|
||||
}
|
||||
out.writeArrayB(array.length, componentEncoder, array);
|
||||
boolean first = true;
|
||||
for (Object v : array) {
|
||||
if (!first) {
|
||||
out.writeArrayMark();
|
||||
}
|
||||
writeMemberValue(out, member, v, first);
|
||||
if (first) {
|
||||
first = false;
|
||||
}
|
||||
}
|
||||
out.writeArrayE();
|
||||
|
||||
@@ -109,17 +109,6 @@ public abstract class Writer {
|
||||
*/
|
||||
public abstract void writeClassName(String clazz);
|
||||
|
||||
/**
|
||||
* 输出一个对象前的操作 注: 覆盖此方法必须要先调用父方法 super.writeObjectB(obj);
|
||||
*
|
||||
* @param obj 写入的对象
|
||||
* @return 返回-1表示还没有写入对象内容,大于-1表示已写入对象内容,返回对象内容大小
|
||||
*/
|
||||
public int writeObjectB(Object obj) {
|
||||
this.comma = false;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* 输出一个为null的对象
|
||||
*
|
||||
@@ -221,6 +210,15 @@ public abstract class Writer {
|
||||
this.writeFieldName(member, attr.field(), attr.genericType(), member.getPosition());
|
||||
}
|
||||
|
||||
/**
|
||||
* 输出一个对象前的操作 注: 覆盖此方法必须要先调用父方法 super.writeObjectB(obj);
|
||||
*
|
||||
* @param obj 写入的对象
|
||||
*/
|
||||
public void writeObjectB(Object obj) {
|
||||
this.comma = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 输出一个对象后的操作
|
||||
*
|
||||
@@ -232,12 +230,10 @@ public abstract class Writer {
|
||||
* 输出一个数组前的操作
|
||||
*
|
||||
* @param size 数组长度
|
||||
* @param arrayEncoder Encodeable 可能是ArrayEncoder、CollectionEncoder或StreamEncoder
|
||||
* @param componentEncoder Encodeable
|
||||
* @param obj 对象, 不一定是数组、Collection对象,也可能是伪Collection对象
|
||||
* @return 返回-1表示还没有写入对象内容,大于-1表示已写入对象内容,返回对象内容大小
|
||||
*/
|
||||
public abstract int writeArrayB(int size, Encodeable arrayEncoder, Encodeable componentEncoder, Object obj);
|
||||
public abstract void writeArrayB(int size, Encodeable componentEncoder, Object obj);
|
||||
|
||||
/** 输出数组元素间的间隔符 */
|
||||
public abstract void writeArrayMark();
|
||||
@@ -252,9 +248,8 @@ public abstract class Writer {
|
||||
* @param keyEncoder Encodeable
|
||||
* @param valueEncoder Encodeable
|
||||
* @param obj 对象, 不一定是Map对象,也可能是伪Map对象
|
||||
* @return 返回-1表示还没有写入对象内容,大于-1表示已写入对象内容,返回对象内容大小
|
||||
*/
|
||||
public abstract int writeMapB(int size, Encodeable keyEncoder, Encodeable valueEncoder, Object obj);
|
||||
public abstract void writeMapB(int size, Encodeable keyEncoder, Encodeable valueEncoder, Object obj);
|
||||
|
||||
/** 输出一个Map中key与value间的间隔符 */
|
||||
public abstract void writeMapMark();
|
||||
|
||||
@@ -179,7 +179,7 @@ public class BsonWriter extends Writer implements ByteTuple {
|
||||
writeNull();
|
||||
return;
|
||||
}
|
||||
writeArrayB(values.length, null, null, values);
|
||||
writeArrayB(values.length, null, values);
|
||||
boolean flag = false;
|
||||
for (byte v : values) {
|
||||
if (flag) {
|
||||
@@ -240,11 +240,10 @@ public class BsonWriter extends Writer implements ByteTuple {
|
||||
}
|
||||
|
||||
@Override
|
||||
public final int writeObjectB(Object obj) {
|
||||
public final void writeObjectB(Object obj) {
|
||||
super.writeObjectB(obj);
|
||||
writeSmallString("");
|
||||
writeShort(BsonReader.SIGN_OBJECTB);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -311,12 +310,11 @@ public class BsonWriter extends Writer implements ByteTuple {
|
||||
}
|
||||
|
||||
@Override
|
||||
public final int writeArrayB(int size, Encodeable arrayEncoder, Encodeable componentEncoder, Object obj) {
|
||||
public final void writeArrayB(int size, Encodeable componentEncoder, Object obj) {
|
||||
writeInt(size);
|
||||
if (componentEncoder != null && componentEncoder != ByteSimpledCoder.instance) {
|
||||
writeByte(BsonFactory.typeEnum(componentEncoder.getType()));
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -330,11 +328,10 @@ public class BsonWriter extends Writer implements ByteTuple {
|
||||
}
|
||||
|
||||
@Override
|
||||
public int writeMapB(int size, Encodeable keyEncoder, Encodeable valueEncoder, Object obj) {
|
||||
public void writeMapB(int size, Encodeable keyEncoder, Encodeable valueEncoder, Object obj) {
|
||||
writeInt(size);
|
||||
writeByte(BsonFactory.typeEnum(keyEncoder.getType()));
|
||||
writeByte(BsonFactory.typeEnum(valueEncoder.getType()));
|
||||
return -1;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -26,15 +26,14 @@ public final class BoolArraySimpledCoder<R extends Reader, W extends Writer> ext
|
||||
out.writeNull();
|
||||
return;
|
||||
}
|
||||
if (out.writeArrayB(values.length, this, BoolSimpledCoder.instance, values) < 0) {
|
||||
boolean flag = false;
|
||||
for (boolean v : values) {
|
||||
if (flag) {
|
||||
out.writeArrayMark();
|
||||
}
|
||||
out.writeBoolean(v);
|
||||
flag = true;
|
||||
out.writeArrayB(values.length, BoolSimpledCoder.instance, values);
|
||||
boolean flag = false;
|
||||
for (boolean v : values) {
|
||||
if (flag) {
|
||||
out.writeArrayMark();
|
||||
}
|
||||
out.writeBoolean(v);
|
||||
flag = true;
|
||||
}
|
||||
out.writeArrayE();
|
||||
}
|
||||
|
||||
@@ -27,15 +27,14 @@ public final class ByteBufferSimpledCoder<R extends Reader, W extends Writer> ex
|
||||
out.writeNull();
|
||||
return;
|
||||
}
|
||||
if (out.writeArrayB(value.remaining(), this, ByteSimpledCoder.instance, value) < 0) {
|
||||
boolean flag = false;
|
||||
for (byte v : value.array()) {
|
||||
if (flag) {
|
||||
out.writeArrayMark();
|
||||
}
|
||||
out.writeByte(v);
|
||||
flag = true;
|
||||
out.writeArrayB(value.remaining(), ByteSimpledCoder.instance, value);
|
||||
boolean flag = false;
|
||||
for (byte v : value.array()) {
|
||||
if (flag) {
|
||||
out.writeArrayMark();
|
||||
}
|
||||
out.writeByte(v);
|
||||
flag = true;
|
||||
}
|
||||
out.writeArrayE();
|
||||
}
|
||||
|
||||
@@ -26,15 +26,14 @@ public final class CharArraySimpledCoder<R extends Reader, W extends Writer> ext
|
||||
out.writeNull();
|
||||
return;
|
||||
}
|
||||
if (out.writeArrayB(values.length, this, CharSimpledCoder.instance, values) < 0) {
|
||||
boolean flag = false;
|
||||
for (char v : values) {
|
||||
if (flag) {
|
||||
out.writeArrayMark();
|
||||
}
|
||||
out.writeChar(v);
|
||||
flag = true;
|
||||
out.writeArrayB(values.length, CharSimpledCoder.instance, values);
|
||||
boolean flag = false;
|
||||
for (char v : values) {
|
||||
if (flag) {
|
||||
out.writeArrayMark();
|
||||
}
|
||||
out.writeChar(v);
|
||||
flag = true;
|
||||
}
|
||||
out.writeArrayE();
|
||||
}
|
||||
|
||||
@@ -27,15 +27,14 @@ public final class DoubleArraySimpledCoder<R extends Reader, W extends Writer> e
|
||||
out.writeNull();
|
||||
return;
|
||||
}
|
||||
if (out.writeArrayB(values.length, this, DoubleSimpledCoder.instance, values) < 0) {
|
||||
boolean flag = false;
|
||||
for (double v : values) {
|
||||
if (flag) {
|
||||
out.writeArrayMark();
|
||||
}
|
||||
out.writeDouble(v);
|
||||
flag = true;
|
||||
out.writeArrayB(values.length, DoubleSimpledCoder.instance, values);
|
||||
boolean flag = false;
|
||||
for (double v : values) {
|
||||
if (flag) {
|
||||
out.writeArrayMark();
|
||||
}
|
||||
out.writeDouble(v);
|
||||
flag = true;
|
||||
}
|
||||
out.writeArrayE();
|
||||
}
|
||||
|
||||
@@ -26,15 +26,14 @@ public final class FloatArraySimpledCoder<R extends Reader, W extends Writer> ex
|
||||
out.writeNull();
|
||||
return;
|
||||
}
|
||||
if (out.writeArrayB(values.length, this, FloatSimpledCoder.instance, values) < 0) {
|
||||
boolean flag = false;
|
||||
for (float v : values) {
|
||||
if (flag) {
|
||||
out.writeArrayMark();
|
||||
}
|
||||
out.writeFloat(v);
|
||||
flag = true;
|
||||
out.writeArrayB(values.length, FloatSimpledCoder.instance, values);
|
||||
boolean flag = false;
|
||||
for (float v : values) {
|
||||
if (flag) {
|
||||
out.writeArrayMark();
|
||||
}
|
||||
out.writeFloat(v);
|
||||
flag = true;
|
||||
}
|
||||
out.writeArrayE();
|
||||
}
|
||||
|
||||
@@ -27,15 +27,14 @@ public final class IntArraySimpledCoder<R extends Reader, W extends Writer> exte
|
||||
out.writeNull();
|
||||
return;
|
||||
}
|
||||
if (out.writeArrayB(values.length, this, IntSimpledCoder.instance, values) < 0) {
|
||||
boolean flag = false;
|
||||
for (int v : values) {
|
||||
if (flag) {
|
||||
out.writeArrayMark();
|
||||
}
|
||||
out.writeInt(v);
|
||||
flag = true;
|
||||
out.writeArrayB(values.length, IntSimpledCoder.instance, values);
|
||||
boolean flag = false;
|
||||
for (int v : values) {
|
||||
if (flag) {
|
||||
out.writeArrayMark();
|
||||
}
|
||||
out.writeInt(v);
|
||||
flag = true;
|
||||
}
|
||||
out.writeArrayE();
|
||||
}
|
||||
|
||||
@@ -27,15 +27,14 @@ public final class LongArraySimpledCoder<R extends Reader, W extends Writer> ext
|
||||
out.writeNull();
|
||||
return;
|
||||
}
|
||||
if (out.writeArrayB(values.length, this, LongSimpledCoder.instance, values) < 0) {
|
||||
boolean flag = false;
|
||||
for (long v : values) {
|
||||
if (flag) {
|
||||
out.writeArrayMark();
|
||||
}
|
||||
out.writeLong(v);
|
||||
flag = true;
|
||||
out.writeArrayB(values.length, LongSimpledCoder.instance, values);
|
||||
boolean flag = false;
|
||||
for (long v : values) {
|
||||
if (flag) {
|
||||
out.writeArrayMark();
|
||||
}
|
||||
out.writeLong(v);
|
||||
flag = true;
|
||||
}
|
||||
out.writeArrayE();
|
||||
}
|
||||
|
||||
@@ -26,15 +26,14 @@ public final class ShortArraySimpledCoder<R extends Reader, W extends Writer> ex
|
||||
out.writeNull();
|
||||
return;
|
||||
}
|
||||
if (out.writeArrayB(values.length, this, ShortSimpledCoder.instance, values) < 0) {
|
||||
boolean flag = false;
|
||||
for (short v : values) {
|
||||
if (flag) {
|
||||
out.writeArrayMark();
|
||||
}
|
||||
out.writeShort(v);
|
||||
flag = true;
|
||||
out.writeArrayB(values.length, ShortSimpledCoder.instance, values);
|
||||
boolean flag = false;
|
||||
for (short v : values) {
|
||||
if (flag) {
|
||||
out.writeArrayMark();
|
||||
}
|
||||
out.writeShort(v);
|
||||
flag = true;
|
||||
}
|
||||
out.writeArrayE();
|
||||
}
|
||||
|
||||
@@ -26,15 +26,14 @@ public final class StringArraySimpledCoder<R extends Reader, W extends Writer> e
|
||||
out.writeNull();
|
||||
return;
|
||||
}
|
||||
if (out.writeArrayB(values.length, this, StringSimpledCoder.instance, values) < 0) {
|
||||
boolean flag = false;
|
||||
for (String v : values) {
|
||||
if (flag) {
|
||||
out.writeArrayMark();
|
||||
}
|
||||
out.writeString(v);
|
||||
flag = true;
|
||||
out.writeArrayB(values.length, StringSimpledCoder.instance, values);
|
||||
boolean flag = false;
|
||||
for (String v : values) {
|
||||
if (flag) {
|
||||
out.writeArrayMark();
|
||||
}
|
||||
out.writeString(v);
|
||||
flag = true;
|
||||
}
|
||||
out.writeArrayE();
|
||||
}
|
||||
|
||||
@@ -183,7 +183,7 @@ public abstract class JsonWriter extends Writer {
|
||||
writeNull();
|
||||
return;
|
||||
}
|
||||
writeArrayB(values.length, null, null, values);
|
||||
writeArrayB(values.length, null, values);
|
||||
boolean flag = false;
|
||||
for (byte v : values) {
|
||||
if (flag) {
|
||||
@@ -224,10 +224,9 @@ public abstract class JsonWriter extends Writer {
|
||||
public final void writeClassName(String clazz) {}
|
||||
|
||||
@Override
|
||||
public final int writeObjectB(Object obj) {
|
||||
public final void writeObjectB(Object obj) {
|
||||
super.writeObjectB(obj);
|
||||
writeTo(BYTE_LBRACE);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -241,9 +240,8 @@ public abstract class JsonWriter extends Writer {
|
||||
}
|
||||
|
||||
@Override
|
||||
public final int writeArrayB(int size, Encodeable arrayEncoder, Encodeable componentEncoder, Object obj) {
|
||||
public final void writeArrayB(int size, Encodeable componentEncoder, Object obj) {
|
||||
writeTo(BYTE_LBRACKET);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -257,9 +255,8 @@ public abstract class JsonWriter extends Writer {
|
||||
}
|
||||
|
||||
@Override
|
||||
public final int writeMapB(int size, Encodeable keyEncoder, Encodeable valueEncoder, Object obj) {
|
||||
public final void writeMapB(int size, Encodeable keyEncoder, Encodeable valueEncoder, Object obj) {
|
||||
writeTo(BYTE_LBRACE);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -9,29 +9,21 @@ import java.lang.reflect.Type;
|
||||
import org.redkale.convert.*;
|
||||
|
||||
/**
|
||||
* 非基本类型数组序列化。 注意: 基础类型不能使用此类
|
||||
* @author zhangjx
|
||||
* @param <T> T
|
||||
*/
|
||||
public class ProtobufArrayEncoder<T> extends ArrayEncoder<ProtobufWriter, T> {
|
||||
|
||||
protected final boolean simple;
|
||||
|
||||
public ProtobufArrayEncoder(ProtobufFactory factory, Type type) {
|
||||
super(factory, type);
|
||||
this.simple = ProtobufFactory.isNoLenBytesType(getComponentType());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void writeMemberValue(ProtobufWriter out, EnMember member, Encodeable encoder, Object item, int index) {
|
||||
if (simple) {
|
||||
if (item == null) {
|
||||
out.writeUInt32(0);
|
||||
} else {
|
||||
componentEncoder.convertTo(out, item);
|
||||
}
|
||||
return;
|
||||
if (member != null) {
|
||||
out.writeFieldName(member);
|
||||
}
|
||||
if (member != null) out.writeFieldName(member);
|
||||
if (item == null) {
|
||||
out.writeUInt32(0);
|
||||
} else if (item instanceof CharSequence) {
|
||||
|
||||
@@ -14,24 +14,15 @@ import org.redkale.convert.*;
|
||||
*/
|
||||
public class ProtobufCollectionEncoder<T> extends CollectionEncoder<ProtobufWriter, T> {
|
||||
|
||||
protected final boolean simple;
|
||||
|
||||
public ProtobufCollectionEncoder(ProtobufFactory factory, Type type) {
|
||||
super(factory, type);
|
||||
this.simple = ProtobufFactory.isNoLenBytesType(getComponentType());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void writeMemberValue(ProtobufWriter out, EnMember member, Object item, boolean first) {
|
||||
if (simple) {
|
||||
if (item == null) {
|
||||
out.writeUInt32(0);
|
||||
} else {
|
||||
componentEncoder.convertTo(out, item);
|
||||
}
|
||||
return;
|
||||
if (member != null) {
|
||||
out.writeFieldName(member);
|
||||
}
|
||||
if (member != null) out.writeFieldName(member);
|
||||
if (item == null) {
|
||||
out.writeUInt32(0);
|
||||
} else if (item instanceof CharSequence) {
|
||||
|
||||
@@ -4,25 +4,15 @@
|
||||
*/
|
||||
package org.redkale.convert.pb;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.*;
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
import org.redkale.asm.Asms;
|
||||
import org.redkale.asm.ClassWriter;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.atomic.*;
|
||||
import static org.redkale.asm.ClassWriter.COMPUTE_FRAMES;
|
||||
import org.redkale.asm.FieldVisitor;
|
||||
import org.redkale.asm.Label;
|
||||
import org.redkale.asm.MethodVisitor;
|
||||
import org.redkale.asm.Opcodes;
|
||||
import org.redkale.asm.*;
|
||||
import static org.redkale.asm.Opcodes.*;
|
||||
import org.redkale.convert.*;
|
||||
import org.redkale.util.AnyValue;
|
||||
import org.redkale.util.RedkaleClassLoader;
|
||||
import org.redkale.util.RedkaleException;
|
||||
import org.redkale.util.Utility;
|
||||
import org.redkale.util.*;
|
||||
|
||||
/**
|
||||
* 简单对象的PROTOBUF序列化操作类
|
||||
@@ -179,8 +169,7 @@ public abstract class ProtobufDynEncoder<T> extends ProtobufObjectEncoder<T> {
|
||||
|
||||
mv.visitVarInsn(ALOAD, 3);
|
||||
mv.visitVarInsn(ALOAD, 2);
|
||||
mv.visitMethodInsn(INVOKEVIRTUAL, pbwriterName, "writeObjectB", "(Ljava/lang/Object;)I", false);
|
||||
mv.visitInsn(POP);
|
||||
mv.visitMethodInsn(INVOKEVIRTUAL, pbwriterName, "writeObjectB", "(Ljava/lang/Object;)V", false);
|
||||
|
||||
for (EnMember member : selfObjEncoder.getMembers()) {
|
||||
final String fieldName = member.getAttribute().field();
|
||||
|
||||
@@ -14,27 +14,18 @@ import org.redkale.convert.*;
|
||||
*/
|
||||
public class ProtobufStreamEncoder<T> extends StreamEncoder<ProtobufWriter, T> {
|
||||
|
||||
protected final boolean simple;
|
||||
|
||||
public ProtobufStreamEncoder(ConvertFactory factory, Type type) {
|
||||
super(factory, type);
|
||||
this.simple = ProtobufFactory.isNoLenBytesType(getComponentType());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void writeMemberValue(ProtobufWriter out, EnMember member, Object item, boolean first) {
|
||||
if (simple) {
|
||||
if (item == null) {
|
||||
out.writeUInt32(0);
|
||||
} else {
|
||||
componentEncoder.convertTo(out, item);
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (member != null) {
|
||||
out.writeFieldName(member);
|
||||
}
|
||||
if (item instanceof CharSequence) {
|
||||
if (item == null) {
|
||||
out.writeUInt32(0);
|
||||
} else if (item instanceof CharSequence) {
|
||||
componentEncoder.convertTo(out, item);
|
||||
} else {
|
||||
ProtobufWriter tmp = out.pollChild();
|
||||
|
||||
@@ -279,9 +279,9 @@ public class ProtobufWriter extends Writer implements ByteTuple {
|
||||
}
|
||||
|
||||
@Override
|
||||
public int writeObjectB(Object obj) {
|
||||
super.writeObjectB(obj);
|
||||
return -1;
|
||||
@ClassDepends
|
||||
public void writeObjectB(Object obj) {
|
||||
// do nothing
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -293,8 +293,8 @@ public class ProtobufWriter extends Writer implements ByteTuple {
|
||||
}
|
||||
|
||||
@Override
|
||||
public int writeArrayB(int size, Encodeable encoder, Encodeable componentEncoder, Object obj) {
|
||||
return -1;
|
||||
public void writeArrayB(int size, Encodeable componentEncoder, Object obj) {
|
||||
// do nothing
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -308,8 +308,8 @@ public class ProtobufWriter extends Writer implements ByteTuple {
|
||||
}
|
||||
|
||||
@Override
|
||||
public int writeMapB(int size, Encodeable keyEncoder, Encodeable valueEncoder, Object obj) {
|
||||
return -1;
|
||||
public void writeMapB(int size, Encodeable keyEncoder, Encodeable valueEncoder, Object obj) {
|
||||
// do nothing
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -329,21 +329,7 @@ public class ProtobufWriter extends Writer implements ByteTuple {
|
||||
|
||||
@Override
|
||||
public final void writeByteArray(byte[] values) {
|
||||
if (values == null) {
|
||||
writeNull();
|
||||
return;
|
||||
}
|
||||
if (writeArrayB(values.length, null, null, values) < 0) {
|
||||
boolean flag = false;
|
||||
for (byte v : values) {
|
||||
if (flag) {
|
||||
writeArrayMark();
|
||||
}
|
||||
writeByte(v);
|
||||
flag = true;
|
||||
}
|
||||
}
|
||||
writeArrayE();
|
||||
writeBytes(values);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user