This commit is contained in:
redkale
2024-10-04 13:17:42 +08:00
parent aaa719214d
commit b5c381d992
11 changed files with 154 additions and 84 deletions

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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);

View File

@@ -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);
}
}
});

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}

View File

@@ -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();
}
/**