pb
This commit is contained in:
@@ -72,18 +72,10 @@ public class ProtobufArrayEncoder<T> extends ArrayEncoder<ProtobufWriter, T>
|
||||
return 0;
|
||||
}
|
||||
ProtobufEncodeable itemEncoder = (ProtobufEncodeable) this.componentEncoder;
|
||||
if (componentPrimitived) {
|
||||
int dataSize = 0;
|
||||
for (Object item : value) {
|
||||
dataSize += itemEncoder.computeSize(out, tagSize, item);
|
||||
}
|
||||
return dataSize;
|
||||
} else {
|
||||
int dataSize = tagSize * value.length;
|
||||
for (Object item : value) {
|
||||
dataSize += itemEncoder.computeSize(out, tagSize, item);
|
||||
}
|
||||
return ProtobufFactory.computeSInt32SizeNoTag(dataSize) + dataSize;
|
||||
int dataSize = componentPrimitived ? 0 : tagSize * (value.length - 1);
|
||||
for (Object item : value) {
|
||||
dataSize += itemEncoder.computeSize(out, tagSize, item);
|
||||
}
|
||||
return dataSize;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -72,18 +72,10 @@ public class ProtobufCollectionEncoder<T> extends CollectionEncoder<ProtobufWrit
|
||||
return 0;
|
||||
}
|
||||
ProtobufEncodeable itemEncoder = (ProtobufEncodeable) this.componentEncoder;
|
||||
if (componentPrimitived) {
|
||||
int dataSize = 0;
|
||||
for (Object item : value) {
|
||||
dataSize += itemEncoder.computeSize(out, tagSize, item);
|
||||
}
|
||||
return dataSize;
|
||||
} else {
|
||||
int dataSize = tagSize * value.size();
|
||||
for (Object item : value) {
|
||||
dataSize += itemEncoder.computeSize(out, tagSize, item);
|
||||
}
|
||||
return ProtobufFactory.computeSInt32SizeNoTag(dataSize) + dataSize;
|
||||
int dataSize = componentPrimitived ? 0 : tagSize * (value.size() - 1);
|
||||
for (Object item : value) {
|
||||
dataSize += itemEncoder.computeSize(out, tagSize, item);
|
||||
}
|
||||
return dataSize;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,9 +48,9 @@ public abstract class ProtobufDynEncoder<T> extends ProtobufObjectEncoder<T> {
|
||||
protected static ProtobufDynEncoder generateDyncEncoder(final ProtobufFactory factory, final Class clazz) {
|
||||
final ObjectEncoder selfObjEncoder = factory.createObjectEncoder(clazz);
|
||||
selfObjEncoder.init(factory); // 必须执行,初始化EnMember内部信息
|
||||
// if (((ProtobufObjectEncoder) selfObjEncoder).requiredMemberSize()) { // 嵌套对象
|
||||
// return null;
|
||||
// }
|
||||
if (true) {
|
||||
return null;
|
||||
}
|
||||
final Map<String, SimpledCoder> simpledCoders = new HashMap<>();
|
||||
final Map<String, EnMember> otherMembers = new HashMap<>();
|
||||
StringBuilder elementb = new StringBuilder();
|
||||
@@ -158,15 +158,16 @@ public abstract class ProtobufDynEncoder<T> extends ProtobufObjectEncoder<T> {
|
||||
mv.visitLineNumber(33, ifLabel);
|
||||
mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
|
||||
|
||||
// ProtobufWriter out = acceptWriter(out0, member);
|
||||
// ProtobufWriter out = acceptWriter(out0, member, value);
|
||||
mv.visitVarInsn(ALOAD, 0); // this
|
||||
mv.visitVarInsn(ALOAD, 1); // out0
|
||||
mv.visitVarInsn(ALOAD, 2); // member
|
||||
mv.visitVarInsn(ALOAD, 3); // value
|
||||
mv.visitMethodInsn(
|
||||
INVOKEVIRTUAL,
|
||||
newDynName,
|
||||
"acceptWriter",
|
||||
"(" + pbwriterDesc + enMemberDesc + ")" + pbwriterDesc,
|
||||
"(" + pbwriterDesc + enMemberDesc + objectDesc + ")" + pbwriterDesc,
|
||||
false);
|
||||
mv.visitVarInsn(ASTORE, 4);
|
||||
|
||||
|
||||
@@ -63,7 +63,11 @@ public class ProtobufMapEncoder<K, V> extends MapEncoder<ProtobufWriter, K, V>
|
||||
if (!first.get()) {
|
||||
out.writeField(member);
|
||||
}
|
||||
ProtobufWriter subout = out.pollChild();
|
||||
boolean poll = true;
|
||||
ProtobufWriter subout = poll ? out.pollChild() : out;
|
||||
if (!poll) {
|
||||
subout.writeLength(computeSize(out, key, val));
|
||||
}
|
||||
subout.writeTag(keyMember.getTag());
|
||||
if (key == null) {
|
||||
subout.writeLength(0);
|
||||
@@ -76,7 +80,9 @@ public class ProtobufMapEncoder<K, V> extends MapEncoder<ProtobufWriter, K, V>
|
||||
} else {
|
||||
vencoder.convertTo(subout, valueMember, val);
|
||||
}
|
||||
out.offerChild(subout);
|
||||
if (poll) {
|
||||
out.offerChild(subout);
|
||||
}
|
||||
first.set(false);
|
||||
}
|
||||
});
|
||||
@@ -99,13 +105,17 @@ public class ProtobufMapEncoder<K, V> extends MapEncoder<ProtobufWriter, K, V>
|
||||
}
|
||||
Set<String> ignoreColumns = this.ignoreMapColumns;
|
||||
BiFunction<K, V, V> mapFieldFunc = out.mapFieldFunc();
|
||||
AtomicBoolean first = new AtomicBoolean();
|
||||
AtomicInteger size = new AtomicInteger();
|
||||
value.forEach((key, val0) -> {
|
||||
if (ignoreColumns == null || !ignoreColumns.contains(key.toString())) {
|
||||
V val = mapFieldFunc == null ? val0 : mapFieldFunc.apply(key, val0);
|
||||
if (val != null) {
|
||||
size.addAndGet(tagSize);
|
||||
if (!first.get()) {
|
||||
// size.addAndGet(tagSize);
|
||||
}
|
||||
size.addAndGet(computeSize(out, key, val));
|
||||
first.set(false);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package org.redkale.convert.pb;
|
||||
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.function.BiFunction;
|
||||
import org.redkale.annotation.ClassDepends;
|
||||
import org.redkale.annotation.Nullable;
|
||||
import org.redkale.convert.*;
|
||||
@@ -36,7 +37,7 @@ public class ProtobufObjectEncoder<T> extends ObjectEncoder<ProtobufWriter, T>
|
||||
return;
|
||||
}
|
||||
|
||||
ProtobufWriter subout = acceptWriter(out, member);
|
||||
ProtobufWriter subout = acceptWriter(out, member, value);
|
||||
subout.writeObjectB(value);
|
||||
int maxPosition = 0;
|
||||
for (EnMember fieldMember : members) {
|
||||
@@ -65,7 +66,12 @@ public class ProtobufObjectEncoder<T> extends ObjectEncoder<ProtobufWriter, T>
|
||||
}
|
||||
|
||||
@ClassDepends
|
||||
protected ProtobufWriter acceptWriter(ProtobufWriter out, EnMember member) {
|
||||
protected ProtobufWriter acceptWriter(ProtobufWriter out, EnMember member, T value) {
|
||||
// if (member != null) {
|
||||
// out.writeLength(computeSize(out, member.getTagSize(), value));
|
||||
// return out;
|
||||
// }
|
||||
// return out;
|
||||
return member != null ? out.pollChild() : out;
|
||||
}
|
||||
|
||||
@@ -90,15 +96,24 @@ public class ProtobufObjectEncoder<T> extends ObjectEncoder<ProtobufWriter, T>
|
||||
|
||||
@Override
|
||||
public int computeSize(ProtobufWriter out, int tagSize, T value) {
|
||||
int size = 0;
|
||||
int dataSize = 0;
|
||||
BiFunction objFieldFunc = out.objFieldFunc();
|
||||
for (EnMember member : members) {
|
||||
ProtobufEncodeable encodeable = (ProtobufEncodeable) member.getEncoder();
|
||||
int itemTagSize = member.getTagSize();
|
||||
int itemDataSize = encodeable.computeSize(out, itemTagSize, member.getFieldValue(value));
|
||||
if (itemDataSize > 0) {
|
||||
size += itemTagSize + itemDataSize;
|
||||
Object val = null;
|
||||
if (objFieldFunc == null) {
|
||||
val = member.getFieldValue(value);
|
||||
} else {
|
||||
val = objFieldFunc.apply(member.getAttribute(), value);
|
||||
}
|
||||
if (val != null) {
|
||||
int itemTagSize = member.getTagSize();
|
||||
int itemDataSize = encodeable.computeSize(out, itemTagSize, val);
|
||||
if (itemDataSize > 0) { // 空集合会返回0
|
||||
dataSize += itemTagSize + itemDataSize;
|
||||
}
|
||||
}
|
||||
}
|
||||
return size;
|
||||
return dataSize;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -78,18 +78,10 @@ public class ProtobufStreamEncoder<T> extends StreamEncoder<ProtobufWriter, T>
|
||||
|
||||
protected int computeSize(ProtobufWriter out, int tagSize, Object[] value) {
|
||||
ProtobufEncodeable itemEncoder = (ProtobufEncodeable) this.componentEncoder;
|
||||
if (componentPrimitived) {
|
||||
int dataSize = 0;
|
||||
for (Object item : value) {
|
||||
dataSize += itemEncoder.computeSize(out, tagSize, item);
|
||||
}
|
||||
return dataSize;
|
||||
} else {
|
||||
int dataSize = tagSize * value.length;
|
||||
for (Object item : value) {
|
||||
dataSize += itemEncoder.computeSize(out, tagSize, item);
|
||||
}
|
||||
return ProtobufFactory.computeSInt32SizeNoTag(dataSize) + dataSize;
|
||||
int dataSize = componentPrimitived ? 0 : tagSize * (value.length - 1);
|
||||
for (Object item : value) {
|
||||
dataSize += itemEncoder.computeSize(out, tagSize, item);
|
||||
}
|
||||
return dataSize;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -93,6 +93,10 @@ public abstract class ProtobufWriter extends Writer {
|
||||
return mapFieldFunc;
|
||||
}
|
||||
|
||||
protected final BiFunction objFieldFunc() {
|
||||
return objFieldFunc;
|
||||
}
|
||||
|
||||
protected Function<Object, ConvertField[]> objExtFunc() {
|
||||
return objExtFunc;
|
||||
}
|
||||
|
||||
@@ -3541,10 +3541,11 @@ public final class Utility {
|
||||
*
|
||||
* @param string 字符串前缀
|
||||
* @param buffer ByteBuffer
|
||||
* @return 字符串
|
||||
*/
|
||||
public static void println(String string, ByteBuffer buffer) {
|
||||
public static String println(String string, ByteBuffer buffer) {
|
||||
if (buffer == null || !buffer.hasRemaining()) {
|
||||
return;
|
||||
return string;
|
||||
}
|
||||
int pos = buffer.position();
|
||||
int limit = buffer.limit();
|
||||
@@ -3552,7 +3553,7 @@ public final class Utility {
|
||||
buffer.get(bytes);
|
||||
buffer.position(pos);
|
||||
buffer.limit(limit);
|
||||
println(string, bytes);
|
||||
return println(string, bytes);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -3560,9 +3561,10 @@ public final class Utility {
|
||||
*
|
||||
* @param string 字符串前缀
|
||||
* @param bytes 字节数组
|
||||
* @return 字符串
|
||||
*/
|
||||
public static void println(String string, byte... bytes) {
|
||||
println(string, bytes, 0, bytes.length);
|
||||
public static String println(String string, byte... bytes) {
|
||||
return println(string, bytes, 0, bytes.length);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -3572,10 +3574,11 @@ public final class Utility {
|
||||
* @param bytes 字节数组
|
||||
* @param start 起始位置
|
||||
* @param len 长度
|
||||
* @return 字符串
|
||||
*/
|
||||
public static void println(String string, byte[] bytes, int start, int len) {
|
||||
public static String println(String string, byte[] bytes, int start, int len) {
|
||||
if (bytes == null) {
|
||||
return;
|
||||
return string;
|
||||
}
|
||||
StringBuilder sb = new StringBuilder();
|
||||
if (string != null) {
|
||||
@@ -3598,6 +3601,7 @@ public final class Utility {
|
||||
}
|
||||
sb.append(']');
|
||||
(System.out).println(sb);
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user