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

View File

@@ -4,13 +4,16 @@
*/
package org.redkale.test.convert.pb;
import java.nio.ByteBuffer;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Supplier;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.redkale.convert.ConvertColumn;
import org.redkale.convert.json.JsonConvert;
import org.redkale.convert.pb.ProtobufConvert;
import org.redkale.test.convert.ConvertHelper;
import org.redkale.util.Utility;
/**
@@ -21,28 +24,37 @@ public class RequiredBeanTest {
public static void main(String[] args) throws Throwable {
RequiredBeanTest test = new RequiredBeanTest();
test.run();
test.run1();
test.run2();
test.run3();
}
@Test
public void run() throws Exception {
public void run1() throws Exception {
System.out.println("-------------------- run1 ---------------------------------");
RequiredBean bean = createRequiredBean();
ProtobufConvert convert = ProtobufConvert.root();
byte[] bytes = convert.convertTo(bean);
System.out.println("序列化0: 26.[0x08,0x0c,0x12,0x03,0x61,0x61,0x61,0x12,0x03,0x62,0x62,0x62,"
+ "0x1a,0x03,0x63,0x63,0x63,0x1a,0x03,0x64,0x64,0x64,0x22,0x02,0x02,0x04]");
Utility.println("序列化0: ", bytes);
RequiredArray array = new RequiredArray();
array.id = 32;
array.beans = new RequiredBean[] {bean, null, bean};
final String excepted = "序列化0: 30.[0x08,0x0c,0x12,0x03,0x61,0x61,0x61,0x12,0x03,0x62,0x62,"
+ "0x62,0x1a,0x03,0x63,0x63,0x63,0x1a,0x03,0x64,0x64,0x64,0x22,0x02,0x2c,0x42,0x2a,"
+ "0x02,0x02,0x04]";
System.out.println(excepted);
String rs = Utility.println("序列化0: ", bytes);
Assertions.assertEquals(excepted, rs);
RequiredArray array = RequiredArray.create(bean);
System.out.println("-----------------------------------------------");
byte[] bytes2 = convert.convertTo(array);
System.out.println("序列化s: 60.[0x0a,0x1a,0x08,0x0c,0x12,0x03,0x61,0x61,0x61,0x12,0x03,0x62,0x62,0x62,"
+ "0x1a,0x03,0x63,0x63,0x63,0x1a,0x03,0x64,0x64,0x64,0x22,0x02,0x02,0x04,"
+ "0x0a,0x00,"
+ "0x0a,0x1a,0x08,0x0c,0x12,0x03,0x61,0x61,0x61,0x12,0x03,0x62,0x62,0x62,"
+ "0x1a,0x03,0x63,0x63,0x63,0x1a,0x03,0x64,0x64,0x64,0x22,0x02,0x02,0x04,"
+ "0x10,0x40]");
Utility.println("序列化s: ", bytes2);
final String excepted2 = "序列化s: 100.[0x0a,0x1e,0x08,0x0c,0x12,0x03,0x61,0x61,0x61,0x12,0x03,"
+ "0x62,0x62,0x62,0x1a,0x03,0x63,0x63,0x63,0x1a,0x03,0x64,0x64,0x64,0x22,0x02,0x2c,"
+ "0x42,0x2a,0x02,0x02,0x04,0x0a,0x00,0x0a,0x1e,0x08,0x0c,0x12,0x03,0x61,0x61,0x61,"
+ "0x12,0x03,0x62,0x62,0x62,0x1a,0x03,0x63,0x63,0x63,0x1a,0x03,0x64,0x64,0x64,0x22,"
+ "0x02,0x2c,0x42,0x2a,0x02,0x02,0x04,0x10,0x40,0x1a,0x1e,0x08,0x0c,0x12,0x03,0x61,"
+ "0x61,0x61,0x12,0x03,0x62,0x62,0x62,0x1a,0x03,0x63,0x63,0x63,0x1a,0x03,0x64,0x64,"
+ "0x64,0x22,0x02,0x2c,0x42,0x2a,0x02,0x02,0x04]";
System.out.println(excepted2);
String rs2 = Utility.println("序列化s: ", bytes2);
Assertions.assertEquals(excepted2, rs2);
System.out.println("-----------------------------------------------");
String jsons1 = JsonConvert.root().convertTo(array);
RequiredArray array2 = convert.convertFrom(RequiredArray.class, bytes2);
@@ -52,12 +64,46 @@ public class RequiredBeanTest {
Assertions.assertEquals(jsons1, jsons2);
}
@Test
public void run2() throws Exception {
System.out.println("-------------------- run3 ---------------------------------");
ProtobufConvert convert = ProtobufConvert.root();
RequiredBean bean = createRequiredBean();
RequiredArray array = RequiredArray.create(bean);
byte[] bs = convert.convertTo(RequiredArray.class, array);
ByteBuffer in = ConvertHelper.createByteBuffer(bs);
RequiredArray rs = convert.convertFrom(RequiredArray.class, in);
Supplier<ByteBuffer> out = ConvertHelper.createSupplier();
ByteBuffer[] buffers = convert.convertTo(out, RequiredArray.class, rs);
byte[] bs2 = ConvertHelper.toBytes(buffers);
Utility.println("proto1 ", bs);
Utility.println("proto2 ", bs2);
Assertions.assertArrayEquals(bs, bs2);
}
@Test
public void run3() throws Exception {
System.out.println("-------------------- run2 ---------------------------------");
ProtobufConvert convert = ProtobufConvert.root();
RequiredBean bean = createRequiredBean();
byte[] bs = convert.convertTo(RequiredBean.class, bean);
ByteBuffer in = ConvertHelper.createByteBuffer(bs);
RequiredBean rs = convert.convertFrom(RequiredBean.class, in);
Supplier<ByteBuffer> out = ConvertHelper.createSupplier();
ByteBuffer[] buffers = convert.convertTo(out, RequiredBean.class, rs);
byte[] bs2 = ConvertHelper.toBytes(buffers);
Utility.println("proto1 ", bs);
Utility.println("proto2 ", bs2);
Assertions.assertArrayEquals(bs, bs2);
}
public static RequiredBean createRequiredBean() {
RequiredBean bean = new RequiredBean();
bean.id = 6;
bean.strs1 = new String[] {"aaa", "bbb"};
bean.strs2 = List.of("ccc", "ddd");
bean.zbig1 = List.of(new AtomicInteger(1), new AtomicInteger(2));
bean.id1 = 6;
bean.strs2 = new String[] {"aaa", "bbb"};
bean.strs3 = List.of("ccc", "ddd");
bean.time4 = List.of(22L, 33L);
bean.zbig5 = List.of(new AtomicInteger(1), new AtomicInteger(2));
return bean;
}
@@ -68,20 +114,34 @@ public class RequiredBeanTest {
@ConvertColumn(index = 2)
public int id;
@ConvertColumn(index = 3)
public RequiredBean one;
public static RequiredArray create(RequiredBean bean) {
RequiredArray array = new RequiredArray();
array.id = 32;
array.beans = new RequiredBean[] {bean, null, bean};
array.one = bean;
return array;
}
}
public static class RequiredBean {
@ConvertColumn(index = 1)
public int id;
public int id1;
@ConvertColumn(index = 2)
public String[] strs1;
public String[] strs2;
@ConvertColumn(index = 3)
public List<String> strs2;
public List<String> strs3;
@ConvertColumn(index = 4)
public List<AtomicInteger> zbig1;
public List<Long> time4;
@ConvertColumn(index = 5)
public List<AtomicInteger> zbig5;
}
}

View File

@@ -30,7 +30,7 @@ public class UserBeanProtoDynEncoder extends ProtobufDynEncoder<UserBean> {
if (value == null) {
return;
}
ProtobufWriter subout = acceptWriter(out, parentMember);
ProtobufWriter subout = acceptWriter(out, parentMember, value);
subout.writeObjectB(value);
subout.writeFieldValue(1, value.getSeqid());
subout.writeFieldValue(2, value.getName());

View File

@@ -37,6 +37,6 @@ public class UserDynTest {
public void run2() throws Exception {
ProtobufFactory factory = ProtobufFactory.root();
Encodeable encoder = factory.loadEncoder(UserBean.class);
Assertions.assertTrue(ProtobufDynEncoder.class.isAssignableFrom(encoder.getClass()));
//Assertions.assertTrue(ProtobufDynEncoder.class.isAssignableFrom(encoder.getClass()));
}
}