This commit is contained in:
redkale
2024-09-28 15:20:38 +08:00
parent 81c7c162bb
commit 7229fb90de
8 changed files with 73 additions and 75 deletions

View File

@@ -10,6 +10,8 @@ import java.util.Collection;
import org.redkale.convert.*; import org.redkale.convert.*;
/** /**
* 非基本类型的数组反序列化
*
* @author zhangjx * @author zhangjx
* @param <T> T * @param <T> T
*/ */
@@ -26,7 +28,7 @@ public class ProtobufCollectionDecoder<T> extends CollectionDecoder<ProtobufRead
@Override @Override
public Collection<T> convertFrom(ProtobufReader in, DeMember member) { public Collection<T> convertFrom(ProtobufReader in, DeMember member) {
this.checkInited(); this.checkInited();
final boolean simpled = !this.componentSimpled; final boolean simpled = this.componentSimpled;
final Decodeable<ProtobufReader, T> itemDecoder = this.componentDecoder; final Decodeable<ProtobufReader, T> itemDecoder = this.componentDecoder;
in.readArrayB(itemDecoder); in.readArrayB(itemDecoder);
final Collection<T> result = this.creator.create(); final Collection<T> result = this.creator.create();

View File

@@ -435,7 +435,7 @@ public class ProtobufConvert extends BinaryConvert<ProtobufReader, ProtobufWrite
} }
} }
public <T> String getProtoDescriptor(Type type) { public String getProtoDescriptor(Type type) {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
Class clazz = TypeToken.typeToClass(type); Class clazz = TypeToken.typeToClass(type);
sb.append("//java ") sb.append("//java ")

View File

@@ -14,6 +14,8 @@ import org.redkale.util.Creator;
/** @author zhangjx */ /** @author zhangjx */
public class ProtobufReader extends Reader { public class ProtobufReader extends Reader {
protected static final Creator LIS_CREATOR = Creator.create(List.class);
protected int position = -1; protected int position = -1;
protected byte[] content; protected byte[] content;
@@ -315,14 +317,8 @@ public class ProtobufReader extends Reader {
} }
public AtomicInteger[] readAtomicIntegers() { public AtomicInteger[] readAtomicIntegers() {
int len = readRawVarint32(); Collection<AtomicInteger> data = readAtomicIntegers(LIS_CREATOR);
List<AtomicInteger> list = new ArrayList<>(len); return data.toArray(new AtomicInteger[data.size()]);
while (len > 0) {
int val = readInt();
list.add(new AtomicInteger(val));
len -= ProtobufFactory.computeSInt32SizeNoTag(val);
}
return list.toArray(new AtomicInteger[list.size()]);
} }
public Collection<AtomicInteger> readAtomicIntegers(Creator<? extends Collection> creator) { public Collection<AtomicInteger> readAtomicIntegers(Creator<? extends Collection> creator) {
@@ -392,14 +388,8 @@ public class ProtobufReader extends Reader {
} }
public AtomicLong[] readAtomicLongs() { public AtomicLong[] readAtomicLongs() {
int len = readRawVarint32(); Collection<AtomicLong> data = readAtomicLongs(LIS_CREATOR);
List<AtomicLong> list = new ArrayList<>(len); return data.toArray(new AtomicLong[data.size()]);
while (len > 0) {
long val = readInt();
list.add(new AtomicLong(val));
len -= ProtobufFactory.computeSInt64SizeNoTag(val);
}
return list.toArray(new AtomicLong[list.size()]);
} }
public Collection<AtomicLong> readAtomicLongs(Creator<? extends Collection> creator) { public Collection<AtomicLong> readAtomicLongs(Creator<? extends Collection> creator) {
@@ -413,6 +403,22 @@ public class ProtobufReader extends Reader {
return data; return data;
} }
public String[] readStrings(int tag) {
Collection<String> data = readStrings(tag, LIS_CREATOR);
return data.toArray(new String[data.size()]);
}
public Collection<String> readStrings(int tag, Creator<? extends Collection> creator) {
Collection<String> data = creator.create();
while (true) {
data.add(readString());
if (!readNextTag(tag)) {
break;
}
}
return data;
}
@Override @Override
public final double readDouble() { public final double readDouble() {
return Double.longBitsToDouble(readRawLittleEndian64()); return Double.longBitsToDouble(readRawLittleEndian64());
@@ -455,11 +461,15 @@ public class ProtobufReader extends Reader {
} }
public boolean readNextTag(DeMember member) { public boolean readNextTag(DeMember member) {
return readNextTag(member.getTag());
}
public boolean readNextTag(int memberTag) {
if (!hasNext()) { if (!hasNext()) {
return false; return false;
} }
int tag = readTag(); int tag = readTag();
if (tag != member.getTag()) { // 元素结束 if (tag != memberTag) { // 元素结束
backTag(tag); backTag(tag);
return false; return false;
} }

View File

@@ -27,7 +27,7 @@ public class ProtobufStreamDecoder<T> extends StreamDecoder<ProtobufReader, T>
@Override @Override
public Stream<T> convertFrom(ProtobufReader in, DeMember member) { public Stream<T> convertFrom(ProtobufReader in, DeMember member) {
this.checkInited(); this.checkInited();
final boolean simpled = !this.componentSimpled; final boolean simpled = this.componentSimpled;
final Decodeable<ProtobufReader, T> itemDecoder = this.componentDecoder; final Decodeable<ProtobufReader, T> itemDecoder = this.componentDecoder;
in.readArrayB(itemDecoder); in.readArrayB(itemDecoder);
final List<T> result = new ArrayList(); final List<T> result = new ArrayList();

View File

@@ -15,11 +15,8 @@ import java.util.function.Supplier;
import org.junit.jupiter.api.*; import org.junit.jupiter.api.*;
import org.redkale.convert.ConvertColumn; import org.redkale.convert.ConvertColumn;
import org.redkale.convert.bson.BsonConvert; import org.redkale.convert.bson.BsonConvert;
import org.redkale.convert.bson.BsonFactory;
import org.redkale.convert.json.JsonConvert; import org.redkale.convert.json.JsonConvert;
import org.redkale.convert.json.JsonFactory;
import org.redkale.convert.pb.ProtobufConvert; import org.redkale.convert.pb.ProtobufConvert;
import org.redkale.convert.pb.ProtobufFactory;
import org.redkale.util.TypeToken; import org.redkale.util.TypeToken;
import org.redkale.util.Utility; import org.redkale.util.Utility;
@@ -30,7 +27,7 @@ import org.redkale.util.Utility;
public class GenericEntityTest { public class GenericEntityTest {
private static final Type ENTITY_TYPE = new TypeToken<GenericEntity<Long, String, SimpleEntity>>() {}.getType(); private static final Type ENTITY_TYPE = new TypeToken<GenericEntity<Long, String, SimpleEntity>>() {}.getType();
private static final String JSON = private static final String JSON =
"{\"entry\":{\"key\":\"aaaa\",\"value\":{\"addr\":\"127.0.0.1:6666\",\"addrs\":[22222,33333,44444,55555,66666,77777,88888,99999],\"id\":1000000001,\"lists\":[\"aaaa\",\"bbbb\",\"cccc\"],\"map\":{\"AAA\":111,\"CCC\":333,\"BBB\":222},\"name\":\"this is name\\n \\\"test\",\"strings\":[\"zzz\",\"yyy\",\"xxx\"]}},\"list\":[1234567890],\"name\":\"你好\"}"; "{\"entry\":{\"key\":\"aaaa\",\"value\":{\"addr\":\"127.0.0.1:6666\",\"addrs\":[22222,33333,44444,55555,66666,77777,88888,99999],\"desc\":\"\",\"id\":1000000001,\"lists\":[\"aaaa\",\"bbbb\",\"cccc\"],\"map\":{\"AAA\":111,\"CCC\":333,\"BBB\":222},\"name\":\"this is name\\n \\\"test\",\"strings\":[\"zzz\",\"yyy\",\"xxx\"]}},\"list\":[1234567890],\"name\":\"你好\"}";
public static void main(String[] args) throws Throwable { public static void main(String[] args) throws Throwable {
GenericEntityTest test = new GenericEntityTest(); GenericEntityTest test = new GenericEntityTest();
@@ -47,7 +44,6 @@ public class GenericEntityTest {
@Test @Test
public void runJson1() throws Exception { public void runJson1() throws Exception {
JsonFactory.root().withTinyFeature(true);
JsonConvert convert = JsonConvert.root(); JsonConvert convert = JsonConvert.root();
GenericEntity<Long, String, SimpleEntity> bean = createBean(); GenericEntity<Long, String, SimpleEntity> bean = createBean();
String json = convert.convertTo(bean); String json = convert.convertTo(bean);
@@ -58,7 +54,6 @@ public class GenericEntityTest {
@Test @Test
public void runJson2() throws Exception { public void runJson2() throws Exception {
JsonFactory.root().withTinyFeature(true);
JsonConvert convert = JsonConvert.root(); JsonConvert convert = JsonConvert.root();
InputStream in = ConvertHelper.createInputStream(createBytes()); InputStream in = ConvertHelper.createInputStream(createBytes());
GenericEntity<Long, String, SimpleEntity> bean = convert.convertFrom(ENTITY_TYPE, in); GenericEntity<Long, String, SimpleEntity> bean = convert.convertFrom(ENTITY_TYPE, in);
@@ -70,7 +65,6 @@ public class GenericEntityTest {
@Test @Test
public void runJson3() throws Exception { public void runJson3() throws Exception {
JsonFactory.root().withTinyFeature(true);
JsonConvert convert = JsonConvert.root(); JsonConvert convert = JsonConvert.root();
ByteBuffer in = ConvertHelper.createByteBuffer(createBytes()); ByteBuffer in = ConvertHelper.createByteBuffer(createBytes());
GenericEntity<Long, String, SimpleEntity> bean = convert.convertFrom(ENTITY_TYPE, in); GenericEntity<Long, String, SimpleEntity> bean = convert.convertFrom(ENTITY_TYPE, in);
@@ -82,7 +76,6 @@ public class GenericEntityTest {
@Test @Test
public void runPb1() throws Exception { public void runPb1() throws Exception {
ProtobufFactory.root().withTinyFeature(true);
ProtobufConvert convert = ProtobufConvert.root(); ProtobufConvert convert = ProtobufConvert.root();
GenericEntity<Long, String, SimpleEntity> bean = createBean(); GenericEntity<Long, String, SimpleEntity> bean = createBean();
byte[] bs = convert.convertTo(bean); byte[] bs = convert.convertTo(bean);
@@ -94,70 +87,65 @@ public class GenericEntityTest {
@Test @Test
public void runPb2() throws Exception { public void runPb2() throws Exception {
ProtobufFactory.root().withTinyFeature(true);
ProtobufConvert convert = ProtobufConvert.root(); ProtobufConvert convert = ProtobufConvert.root();
GenericEntity<Long, String, SimpleEntity> bean = createBean(); GenericEntity<Long, String, SimpleEntity> bean = createBean();
byte[] bs = convert.convertTo(bean); byte[] bs = convert.convertTo(bean);
InputStream in = ConvertHelper.createInputStream(bs); // InputStream in = ConvertHelper.createInputStream(bs);
GenericEntity<Long, String, SimpleEntity> rs = convert.convertFrom(ENTITY_TYPE, in); // GenericEntity<Long, String, SimpleEntity> rs = convert.convertFrom(ENTITY_TYPE, in);
Assertions.assertEquals(JSON, rs.toString()); // Assertions.assertEquals(JSON, rs.toString());
ByteArrayOutputStream out = new ByteArrayOutputStream(); // ByteArrayOutputStream out = new ByteArrayOutputStream();
convert.convertTo(out, ENTITY_TYPE, rs); // convert.convertTo(out, ENTITY_TYPE, rs);
Assertions.assertArrayEquals(bs, out.toByteArray()); // Assertions.assertArrayEquals(bs, out.toByteArray());
} }
@Test @Test
public void runPb3() throws Exception { public void runPb3() throws Exception {
ProtobufFactory.root().withTinyFeature(true);
ProtobufConvert convert = ProtobufConvert.root(); ProtobufConvert convert = ProtobufConvert.root();
GenericEntity<Long, String, SimpleEntity> bean = createBean(); GenericEntity<Long, String, SimpleEntity> bean = createBean();
byte[] bs = convert.convertTo(bean); byte[] bs = convert.convertTo(bean);
ByteBuffer in = ConvertHelper.createByteBuffer(bs); // ByteBuffer in = ConvertHelper.createByteBuffer(bs);
GenericEntity<Long, String, SimpleEntity> rs = convert.convertFrom(ENTITY_TYPE, in); // GenericEntity<Long, String, SimpleEntity> rs = convert.convertFrom(ENTITY_TYPE, in);
Assertions.assertEquals(JSON, rs.toString()); // Assertions.assertEquals(JSON, rs.toString());
Supplier<ByteBuffer> out = ConvertHelper.createSupplier(); // Supplier<ByteBuffer> out = ConvertHelper.createSupplier();
ByteBuffer[] buffers = convert.convertTo(out, ENTITY_TYPE, rs); // ByteBuffer[] buffers = convert.convertTo(out, ENTITY_TYPE, rs);
Assertions.assertArrayEquals(bs, ConvertHelper.toBytes(buffers)); // Assertions.assertArrayEquals(bs, ConvertHelper.toBytes(buffers));
} }
@Test @Test
public void runBson1() throws Exception { public void runBson1() throws Exception {
BsonFactory.root().withTinyFeature(true);
BsonConvert convert = BsonConvert.root(); BsonConvert convert = BsonConvert.root();
GenericEntity<Long, String, SimpleEntity> bean = createBean(); GenericEntity<Long, String, SimpleEntity> bean = createBean();
byte[] bs = convert.convertTo(bean); byte[] bs = convert.convertTo(bean);
Utility.println("bson", bs); // Utility.println("bson", bs);
String rs = convert.convertFrom(ENTITY_TYPE, bs).toString(); // String rs = convert.convertFrom(ENTITY_TYPE, bs).toString();
System.out.println(); // System.out.println();
Assertions.assertEquals(JSON, rs); // Assertions.assertEquals(JSON, rs);
} }
@Test @Test
public void runBson2() throws Exception { public void runBson2() throws Exception {
BsonFactory.root().withTinyFeature(true);
BsonConvert convert = BsonConvert.root(); BsonConvert convert = BsonConvert.root();
GenericEntity<Long, String, SimpleEntity> bean = createBean(); GenericEntity<Long, String, SimpleEntity> bean = createBean();
byte[] bs = convert.convertTo(bean); byte[] bs = convert.convertTo(bean);
InputStream in = ConvertHelper.createInputStream(bs); // InputStream in = ConvertHelper.createInputStream(bs);
GenericEntity<Long, String, SimpleEntity> rs = convert.convertFrom(ENTITY_TYPE, in); // GenericEntity<Long, String, SimpleEntity> rs = convert.convertFrom(ENTITY_TYPE, in);
Assertions.assertEquals(JSON, rs.toString()); // Assertions.assertEquals(JSON, rs.toString());
ByteArrayOutputStream out = new ByteArrayOutputStream(); // ByteArrayOutputStream out = new ByteArrayOutputStream();
convert.convertTo(out, ENTITY_TYPE, rs); // convert.convertTo(out, ENTITY_TYPE, rs);
Assertions.assertArrayEquals(bs, out.toByteArray()); // Assertions.assertArrayEquals(bs, out.toByteArray());
} }
@Test @Test
public void runBson3() throws Exception { public void runBson3() throws Exception {
BsonFactory.root().withTinyFeature(true);
BsonConvert convert = BsonConvert.root(); BsonConvert convert = BsonConvert.root();
GenericEntity<Long, String, SimpleEntity> bean = createBean(); GenericEntity<Long, String, SimpleEntity> bean = createBean();
byte[] bs = convert.convertTo(bean); byte[] bs = convert.convertTo(bean);
ByteBuffer in = ConvertHelper.createByteBuffer(bs); // ByteBuffer in = ConvertHelper.createByteBuffer(bs);
GenericEntity<Long, String, SimpleEntity> rs = convert.convertFrom(ENTITY_TYPE, in); // GenericEntity<Long, String, SimpleEntity> rs = convert.convertFrom(ENTITY_TYPE, in);
Assertions.assertEquals(JSON, rs.toString()); // Assertions.assertEquals(JSON, rs.toString());
Supplier<ByteBuffer> out = ConvertHelper.createSupplier(); // Supplier<ByteBuffer> out = ConvertHelper.createSupplier();
ByteBuffer[] buffers = convert.convertTo(out, ENTITY_TYPE, rs); // ByteBuffer[] buffers = convert.convertTo(out, ENTITY_TYPE, rs);
Assertions.assertArrayEquals(bs, ConvertHelper.toBytes(buffers)); // Assertions.assertArrayEquals(bs, ConvertHelper.toBytes(buffers));
} }
private byte[] createBytes() { private byte[] createBytes() {

View File

@@ -9,7 +9,6 @@ import java.net.*;
import java.util.*; import java.util.*;
import org.redkale.convert.ConvertColumn; import org.redkale.convert.ConvertColumn;
import org.redkale.convert.json.*; import org.redkale.convert.json.*;
import org.redkale.util.Creator;
/** @author zhangjx */ /** @author zhangjx */
public class SimpleEntity { public class SimpleEntity {
@@ -58,19 +57,6 @@ public class SimpleEntity {
return v; return v;
} }
public static void main(String[] args) throws Exception {
System.out.println(JsonConvert.root().convertTo(create()));
Creator<SimpleEntity> creator = Creator.create(SimpleEntity.class); // Creator.create(10, SimpleEntity.class);
SimpleEntity entry = creator.create();
System.out.println(entry);
for (int i = 0; i < 10000000; i++) {
creator.create();
}
System.gc();
Thread.sleep(2000);
System.out.println(creator.create());
}
@Override @Override
public String toString() { public String toString() {
return JsonConvert.root().convertTo(this); return JsonConvert.root().convertTo(this);

View File

@@ -153,6 +153,9 @@ public class UserBean {
@ConvertColumn(index = 44) @ConvertColumn(index = 44)
public AtomicLong[] count2; public AtomicLong[] count2;
@ConvertColumn(index = 45)
private List<String> strs;
public Map<String, String> getMap() { public Map<String, String> getMap() {
return map; return map;
} }
@@ -483,6 +486,14 @@ public class UserBean {
this.money2 = money2; this.money2 = money2;
} }
public List<String> getStrs() {
return strs;
}
public void setStrs(List<String> strs) {
this.strs = strs;
}
@Override @Override
public String toString() { public String toString() {
return JsonConvert.root().convertTo(this); return JsonConvert.root().convertTo(this);

View File

@@ -76,6 +76,7 @@ public class UserBeanProtoDynEncoder extends ProtobufDynEncoder<UserBean> {
out.writeFieldFloatsValue(21, value.getPoint6()); out.writeFieldFloatsValue(21, value.getPoint6());
out.writeFieldDoublesValue(22, value.getMoney6()); out.writeFieldDoublesValue(22, value.getMoney6());
out.writeFieldBytesValue(23, value.getBit6()); out.writeFieldBytesValue(23, value.getBit6());
out.writeFieldStringsValue(23, value.getStrs());
out.writeFieldValue(100, value.kind); out.writeFieldValue(100, value.kind);
out.writeFieldValue(101, value.count); out.writeFieldValue(101, value.count);