This commit is contained in:
redkale
2024-09-18 22:15:10 +08:00
parent 79e63fa7ad
commit a79c4303aa
5 changed files with 181 additions and 43 deletions

View File

@@ -175,10 +175,13 @@ public class JsonReader extends Reader {
* @return 有效字符 * @return 有效字符
*/ */
protected char nextGoodChar(boolean allowComment) { protected char nextGoodChar(boolean allowComment) {
char c = 0;
char[] text0 = this.text; char[] text0 = this.text;
int end = this.limit; int end = this.limit;
int curr = ++this.position; int curr = ++this.position;
char c = text0[curr];
if (c > ' ' && c != '/') {
return c;
}
for (; curr <= end; curr++) { for (; curr <= end; curr++) {
c = text0[curr]; c = text0[curr];
if (c > ' ') { if (c > ' ') {

View File

@@ -34,10 +34,10 @@ public class ProtobufConvert extends BinaryConvert<ProtobufReader, ProtobufWrite
private final ThreadLocal<ProtobufReader> readerPool = Utility.withInitialThreadLocal(ProtobufReader::new); private final ThreadLocal<ProtobufReader> readerPool = Utility.withInitialThreadLocal(ProtobufReader::new);
@Nullable @Nullable
private Encodeable lastConvertEncodeable; private Encodeable lastEncodeable;
@Nullable @Nullable
private Decodeable lastConvertDecodeable; private Decodeable lastDecodeable;
protected ProtobufConvert(ConvertFactory<ProtobufReader, ProtobufWriter> factory, int features) { protected ProtobufConvert(ConvertFactory<ProtobufReader, ProtobufWriter> factory, int features) {
super(factory, features); super(factory, features);
@@ -600,10 +600,10 @@ public class ProtobufConvert extends BinaryConvert<ProtobufReader, ProtobufWrite
return null; return null;
} }
final ProtobufReader reader = new ProtobufReader(bytes, offset, len); final ProtobufReader reader = new ProtobufReader(bytes, offset, len);
Decodeable decoder = this.lastConvertDecodeable; Decodeable decoder = this.lastDecodeable;
if (decoder == null || decoder.getType() != type) { if (decoder == null || decoder.getType() != type) {
decoder = factory.loadDecoder(type); decoder = factory.loadDecoder(type);
this.lastConvertDecodeable = decoder; this.lastDecodeable = decoder;
} }
if (!(decoder instanceof ObjectDecoder) && !(decoder instanceof SimpledCoder)) { if (!(decoder instanceof ObjectDecoder) && !(decoder instanceof SimpledCoder)) {
throw new ConvertException(this.getClass().getSimpleName() + " not supported type(" + type + ")"); throw new ConvertException(this.getClass().getSimpleName() + " not supported type(" + type + ")");
@@ -620,10 +620,10 @@ public class ProtobufConvert extends BinaryConvert<ProtobufReader, ProtobufWrite
if (type == null || in == null) { if (type == null || in == null) {
return null; return null;
} }
Decodeable decoder = this.lastConvertDecodeable; Decodeable decoder = this.lastDecodeable;
if (decoder == null || decoder.getType() != type) { if (decoder == null || decoder.getType() != type) {
decoder = factory.loadDecoder(type); decoder = factory.loadDecoder(type);
this.lastConvertDecodeable = decoder; this.lastDecodeable = decoder;
} }
if (!(decoder instanceof ObjectDecoder)) { if (!(decoder instanceof ObjectDecoder)) {
throw new ConvertException(this.getClass().getSimpleName() + " not supported type(" + type + ")"); throw new ConvertException(this.getClass().getSimpleName() + " not supported type(" + type + ")");
@@ -640,10 +640,10 @@ public class ProtobufConvert extends BinaryConvert<ProtobufReader, ProtobufWrite
if (type == null || Utility.isEmpty(buffers)) { if (type == null || Utility.isEmpty(buffers)) {
return null; return null;
} }
Decodeable decoder = this.lastConvertDecodeable; Decodeable decoder = this.lastDecodeable;
if (decoder == null || decoder.getType() != type) { if (decoder == null || decoder.getType() != type) {
decoder = factory.loadDecoder(type); decoder = factory.loadDecoder(type);
this.lastConvertDecodeable = decoder; this.lastDecodeable = decoder;
} }
if (!(decoder instanceof ObjectDecoder)) { if (!(decoder instanceof ObjectDecoder)) {
throw new ConvertException(this.getClass().getSimpleName() + " not supported type(" + type + ")"); throw new ConvertException(this.getClass().getSimpleName() + " not supported type(" + type + ")");
@@ -657,10 +657,10 @@ public class ProtobufConvert extends BinaryConvert<ProtobufReader, ProtobufWrite
if (type == null) { if (type == null) {
return null; return null;
} }
Decodeable decoder = this.lastConvertDecodeable; Decodeable decoder = this.lastDecodeable;
if (decoder == null || decoder.getType() != type) { if (decoder == null || decoder.getType() != type) {
decoder = factory.loadDecoder(type); decoder = factory.loadDecoder(type);
this.lastConvertDecodeable = decoder; this.lastDecodeable = decoder;
} }
if (!(decoder instanceof ObjectDecoder)) { if (!(decoder instanceof ObjectDecoder)) {
throw new ConvertException(this.getClass().getSimpleName() + " not supported type(" + type + ")"); throw new ConvertException(this.getClass().getSimpleName() + " not supported type(" + type + ")");
@@ -681,10 +681,10 @@ public class ProtobufConvert extends BinaryConvert<ProtobufReader, ProtobufWrite
} }
final Type t = type == null ? value.getClass() : type; final Type t = type == null ? value.getClass() : type;
final ProtobufWriter writer = pollWriter(); final ProtobufWriter writer = pollWriter();
Encodeable encoder = this.lastConvertEncodeable; Encodeable encoder = this.lastEncodeable;
if (encoder == null || encoder.getType() != t) { if (encoder == null || encoder.getType() != t) {
encoder = factory.loadEncoder(t); encoder = factory.loadEncoder(t);
this.lastConvertEncodeable = encoder; this.lastEncodeable = encoder;
} }
if (encoder.specifyable()) { if (encoder.specifyable()) {
writer.specificObjectType(t); writer.specificObjectType(t);
@@ -707,10 +707,10 @@ public class ProtobufConvert extends BinaryConvert<ProtobufReader, ProtobufWrite
return null; return null;
} }
final ProtobufWriter writer = pollWriter(); final ProtobufWriter writer = pollWriter();
Encodeable encoder = this.lastConvertEncodeable; Encodeable encoder = this.lastEncodeable;
if (encoder == null || encoder.getType() != type) { if (encoder == null || encoder.getType() != type) {
encoder = factory.loadEncoder(type); encoder = factory.loadEncoder(type);
this.lastConvertEncodeable = encoder; this.lastEncodeable = encoder;
} }
if (encoder.specifyable()) { if (encoder.specifyable()) {
writer.specificObjectType(type); writer.specificObjectType(type);
@@ -739,10 +739,10 @@ public class ProtobufConvert extends BinaryConvert<ProtobufReader, ProtobufWrite
writer.writeNull(); writer.writeNull();
} else { } else {
final Type t = type == null ? value.getClass() : type; final Type t = type == null ? value.getClass() : type;
Encodeable encoder = this.lastConvertEncodeable; Encodeable encoder = this.lastEncodeable;
if (encoder == null || encoder.getType() != t) { if (encoder == null || encoder.getType() != t) {
encoder = factory.loadEncoder(t); encoder = factory.loadEncoder(t);
this.lastConvertEncodeable = encoder; this.lastEncodeable = encoder;
} }
if (encoder.specifyable()) { if (encoder.specifyable()) {
writer.specificObjectType(t); writer.specificObjectType(t);
@@ -765,10 +765,10 @@ public class ProtobufConvert extends BinaryConvert<ProtobufReader, ProtobufWrite
writer.writeNull(); writer.writeNull();
} else { } else {
final Type t = type == null ? value.getClass() : type; final Type t = type == null ? value.getClass() : type;
Encodeable encoder = this.lastConvertEncodeable; Encodeable encoder = this.lastEncodeable;
if (encoder == null || encoder.getType() != t) { if (encoder == null || encoder.getType() != t) {
encoder = factory.loadEncoder(t); encoder = factory.loadEncoder(t);
this.lastConvertEncodeable = encoder; this.lastEncodeable = encoder;
} }
if (encoder.specifyable()) { if (encoder.specifyable()) {
writer.specificObjectType(t); writer.specificObjectType(t);
@@ -790,10 +790,10 @@ public class ProtobufConvert extends BinaryConvert<ProtobufReader, ProtobufWrite
writer.writeNull(); writer.writeNull();
} else { } else {
final Type t = type == null ? value.getClass() : type; final Type t = type == null ? value.getClass() : type;
Encodeable encoder = this.lastConvertEncodeable; Encodeable encoder = this.lastEncodeable;
if (encoder == null || encoder.getType() != t) { if (encoder == null || encoder.getType() != t) {
encoder = factory.loadEncoder(t); encoder = factory.loadEncoder(t);
this.lastConvertEncodeable = encoder; this.lastEncodeable = encoder;
} }
if (encoder.specifyable()) { if (encoder.specifyable()) {
writer.specificObjectType(t); writer.specificObjectType(t);
@@ -815,10 +815,10 @@ public class ProtobufConvert extends BinaryConvert<ProtobufReader, ProtobufWrite
writer.writeNull(); writer.writeNull();
} else { } else {
final Type t = type == null ? value.getClass() : type; final Type t = type == null ? value.getClass() : type;
Encodeable encoder = this.lastConvertEncodeable; Encodeable encoder = this.lastEncodeable;
if (encoder == null || encoder.getType() != t) { if (encoder == null || encoder.getType() != t) {
encoder = factory.loadEncoder(t); encoder = factory.loadEncoder(t);
this.lastConvertEncodeable = encoder; this.lastEncodeable = encoder;
} }
if (encoder.specifyable()) { if (encoder.specifyable()) {
writer.specificObjectType(t); writer.specificObjectType(t);
@@ -839,10 +839,10 @@ public class ProtobufConvert extends BinaryConvert<ProtobufReader, ProtobufWrite
} }
writer.initOffset = writer.count; writer.initOffset = writer.count;
final Type t = type == null ? value.getClass() : type; final Type t = type == null ? value.getClass() : type;
Encodeable encoder = this.lastConvertEncodeable; Encodeable encoder = this.lastEncodeable;
if (encoder == null || encoder.getType() != t) { if (encoder == null || encoder.getType() != t) {
encoder = factory.loadEncoder(t); encoder = factory.loadEncoder(t);
this.lastConvertEncodeable = encoder; this.lastEncodeable = encoder;
} }
if (encoder.specifyable()) { if (encoder.specifyable()) {
writer.specificObjectType(t); writer.specificObjectType(t);
@@ -856,10 +856,10 @@ public class ProtobufConvert extends BinaryConvert<ProtobufReader, ProtobufWrite
} }
final ProtobufWriter writer = pollWriter(); final ProtobufWriter writer = pollWriter();
final Type t = type == null ? value.getClass() : type; final Type t = type == null ? value.getClass() : type;
Encodeable encoder = this.lastConvertEncodeable; Encodeable encoder = this.lastEncodeable;
if (encoder == null || encoder.getType() != t) { if (encoder == null || encoder.getType() != t) {
encoder = factory.loadEncoder(t); encoder = factory.loadEncoder(t);
this.lastConvertEncodeable = encoder; this.lastEncodeable = encoder;
} }
if (encoder.specifyable()) { if (encoder.specifyable()) {
writer.specificObjectType(t); writer.specificObjectType(t);

View File

@@ -72,7 +72,7 @@ public class ProtobufWriter extends Writer implements ByteTuple {
} }
public ProtobufWriter(int size) { public ProtobufWriter(int size) {
this.content = new byte[size > 128 ? size : 128]; this.content = new byte[Math.max(size, DEFAULT_SIZE)];
} }
public ProtobufWriter(ByteArray array) { public ProtobufWriter(ByteArray array) {
@@ -150,7 +150,7 @@ public class ProtobufWriter extends Writer implements ByteTuple {
protected int expand(int len) { protected int expand(int len) {
int newcount = count + len; int newcount = count + len;
if (newcount > content.length) { if (newcount > content.length) {
byte[] newdata = new byte[Math.max(content.length * 3 / 2, newcount)]; byte[] newdata = new byte[Math.max(content.length * 2, newcount)];
System.arraycopy(content, 0, newdata, 0, count); System.arraycopy(content, 0, newdata, 0, count);
this.content = newdata; this.content = newdata;
} }
@@ -330,10 +330,6 @@ public class ProtobufWriter extends Writer implements ByteTuple {
for (Double item : (Collection<Double>) obj) { for (Double item : (Collection<Double>) obj) {
tmp.writeDouble(item); tmp.writeDouble(item);
} }
} else if (componentType == Long.class) {
for (Long item : (Collection<Long>) obj) {
tmp.writeLong(item);
}
} else if (componentType == AtomicInteger.class) { } else if (componentType == AtomicInteger.class) {
for (AtomicInteger item : (Collection<AtomicInteger>) obj) { for (AtomicInteger item : (Collection<AtomicInteger>) obj) {
tmp.writeInt(item == null ? 0 : item.get()); tmp.writeInt(item == null ? 0 : item.get());
@@ -351,17 +347,17 @@ public class ProtobufWriter extends Writer implements ByteTuple {
Type componentType = streamEncoder.getComponentType(); Type componentType = streamEncoder.getComponentType();
if (streamEncoder.simple) { if (streamEncoder.simple) {
if (componentType == Boolean.class) { if (componentType == Boolean.class) {
((Stream<Boolean>) obj).forEach(item -> tmp.writeBoolean(item)); ((Stream<Boolean>) obj).forEach(tmp::writeBoolean);
} else if (componentType == Short.class) { } else if (componentType == Short.class) {
((Stream<Short>) obj).forEach(item -> tmp.writeShort(item)); ((Stream<Short>) obj).forEach(tmp::writeShort);
} else if (componentType == Integer.class) { } else if (componentType == Integer.class) {
((Stream<Integer>) obj).forEach(item -> tmp.writeInt(item)); ((Stream<Integer>) obj).forEach(tmp::writeInt);
} else if (componentType == Float.class) { } else if (componentType == Float.class) {
((Stream<Float>) obj).forEach(item -> tmp.writeFloat(item)); ((Stream<Float>) obj).forEach(tmp::writeFloat);
} else if (componentType == Long.class) { } else if (componentType == Long.class) {
((Stream<Long>) obj).forEach(item -> tmp.writeLong(item)); ((Stream<Long>) obj).forEach(tmp::writeLong);
} else if (componentType == Double.class) { } else if (componentType == Double.class) {
((Stream<Double>) obj).forEach(item -> tmp.writeDouble(item)); ((Stream<Double>) obj).forEach(tmp::writeDouble);
} else if (componentType == AtomicInteger.class) { } else if (componentType == AtomicInteger.class) {
((Stream<AtomicInteger>) obj).forEach(item -> tmp.writeInt(item == null ? 0 : item.get())); ((Stream<AtomicInteger>) obj).forEach(item -> tmp.writeInt(item == null ? 0 : item.get()));
} else if (componentType == AtomicLong.class) { } else if (componentType == AtomicLong.class) {
@@ -374,7 +370,7 @@ public class ProtobufWriter extends Writer implements ByteTuple {
return -1; return -1;
} }
int length = tmp.count(); int length = tmp.count();
writeUInt32(length); writeLength(length);
writeTo(tmp.toArray()); writeTo(tmp.toArray());
return length; return length;
} }
@@ -408,8 +404,7 @@ public class ProtobufWriter extends Writer implements ByteTuple {
@Override @Override
public void writeFieldName(EnMember member, String fieldName, Type fieldType, int fieldPos) { public void writeFieldName(EnMember member, String fieldName, Type fieldType, int fieldPos) {
int tag = ProtobufFactory.getTag(fieldName, fieldType, fieldPos, enumtostring); writeTag(member.getTag());
writeUInt32(tag);
} }
@Override @Override
@@ -579,7 +574,7 @@ public class ProtobufWriter extends Writer implements ByteTuple {
@Override @Override
public void writeString(String value) { public void writeString(String value) {
byte[] bs = Utility.isLatin1(value) ? Utility.latin1ByteArray(value) : Utility.encodeUTF8(value); byte[] bs = Utility.isLatin1(value) ? Utility.latin1ByteArray(value) : Utility.encodeUTF8(value);
writeUInt32(bs.length); writeLength(bs.length);
writeTo(bs); writeTo(bs);
} }
@@ -604,6 +599,22 @@ public class ProtobufWriter extends Writer implements ByteTuple {
} }
} }
protected void writeTag(int tag) {
if (tag < 128) {
writeTo((byte) tag);
} else {
writeUInt32(tag);
}
}
protected void writeLength(int value) {
if (value < 128) {
writeTo((byte) value);
} else {
writeUInt32(value);
}
}
protected void writeUInt32(int value) { protected void writeUInt32(int value) {
while (true) { while (true) {
if ((value & ~0x7F) == 0) { if ((value & ~0x7F) == 0) {

View File

@@ -0,0 +1,97 @@
/*
* Copyright (c) 2016-2116 Redkale
* All rights reserved.
*/
package org.redkale.test.convert.pb;
import java.util.Date;
import org.redkale.convert.ConvertColumn;
import org.redkale.convert.json.JsonConvert;
/**
*
* @author zhangjx
*/
public class User {
@ConvertColumn(index = 1)
private Long id;
@ConvertColumn(index = 2)
private String name;
@ConvertColumn(index = 3)
private String trueName;
@ConvertColumn(index = 4)
private Integer age;
@ConvertColumn(index = 5)
private String sex;
@ConvertColumn(index = 6)
private Date createTime;
public static User create() {
User user = new User();
user.setId(1L);
user.setName("赵侠客"); //
user.setAge(29);
user.setSex("");
user.setTrueName("公众号");
user.setCreateTime(new Date(1451577600000L));
return user;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTrueName() {
return trueName;
}
public void setTrueName(String trueName) {
this.trueName = trueName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
@Override
public String toString() {
return JsonConvert.root().convertTo(this);
}
}

View File

@@ -0,0 +1,27 @@
/*
* Copyright (c) 2016-2116 Redkale
* All rights reserved.
*/
package org.redkale.test.convert.pb;
import org.junit.jupiter.api.Test;
import org.redkale.convert.pb.ProtobufConvert;
/**
*
* @author zhangjx
*/
public class UserTest {
public static void main(String[] args) throws Throwable {
UserTest test = new UserTest();
test.run();
}
@Test
public void run() throws Exception {
User user = User.create();
ProtobufConvert convert = ProtobufConvert.root();
convert.convertTo(user);
}
}