This commit is contained in:
redkale
2024-09-19 10:25:13 +08:00
parent 3646e0ab15
commit 2cf74bedca
9 changed files with 37 additions and 69 deletions

View File

@@ -7,11 +7,6 @@ package org.redkale.convert.json;
import java.lang.reflect.*; import java.lang.reflect.*;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.*; import java.util.*;
import org.redkale.asm.*; import org.redkale.asm.*;
import static org.redkale.asm.ClassWriter.COMPUTE_FRAMES; import static org.redkale.asm.ClassWriter.COMPUTE_FRAMES;
@@ -82,24 +77,6 @@ public abstract class JsonDynEncoder<T> implements Encodeable<JsonWriter, T> {
if (type == Double.class) { if (type == Double.class) {
return true; return true;
} }
if (type == BigInteger.class) {
return true;
}
if (type == BigDecimal.class) {
return true;
}
if (type == LocalDate.class) {
return true;
}
if (type == LocalTime.class) {
return true;
}
if (type == LocalDateTime.class) {
return true;
}
if (type == java.util.Date.class) {
return true;
}
if (type == boolean[].class) { if (type == boolean[].class) {
return true; return true;
} }
@@ -151,7 +128,9 @@ public abstract class JsonDynEncoder<T> implements Encodeable<JsonWriter, T> {
if (type == String[].class) { if (type == String[].class) {
return true; return true;
} }
if (factory.rootFactory().findEncoder(type) != null) {
return true;
}
if (declaringClass == clazz) { if (declaringClass == clazz) {
return false; return false;
} }
@@ -168,12 +147,7 @@ public abstract class JsonDynEncoder<T> implements Encodeable<JsonWriter, T> {
|| t == Long.class || t == Long.class
|| t == Double.class || t == Double.class
|| t == String.class || t == String.class
|| t == BigInteger.class || factory.rootFactory().findEncoder(t) != null
|| t == BigDecimal.class
|| t == LocalDate.class
|| t == LocalTime.class
|| t == LocalDateTime.class
|| t == java.util.Date.class
|| ((t instanceof Class) && ((Class) t).isEnum())) { || ((t instanceof Class) && ((Class) t).isEnum())) {
return true; return true;
} }

View File

@@ -35,7 +35,7 @@ public class ProtobufCollectionEncoder<T> extends CollectionEncoder<ProtobufWrit
protected void writeMemberValue(ProtobufWriter out, EnMember member, Object item, boolean first) { protected void writeMemberValue(ProtobufWriter out, EnMember member, Object item, boolean first) {
if (simple) { if (simple) {
if (item == null) { if (item == null) {
((ProtobufWriter) out).writeUInt32(0); out.writeUInt32(0);
} else { } else {
componentEncoder.convertTo(out, item); componentEncoder.convertTo(out, item);
} }

View File

@@ -20,7 +20,7 @@ import org.redkale.util.RedkaleClassLoader;
* @param <W> Writer输出的子类型 * @param <W> Writer输出的子类型
* @param <E> Enum的子类 * @param <E> Enum的子类
*/ */
public class ProtobufEnumSimpledCoder<R extends Reader, W extends Writer, E extends Enum> public class ProtobufEnumSimpledCoder<R extends ProtobufReader, W extends ProtobufWriter, E extends Enum>
extends SimpledCoder<R, W, E> { extends SimpledCoder<R, W, E> {
private final Map<Integer, E> values = new HashMap<>(); private final Map<Integer, E> values = new HashMap<>();
@@ -48,7 +48,7 @@ public class ProtobufEnumSimpledCoder<R extends Reader, W extends Writer, E exte
} else if (enumtostring) { } else if (enumtostring) {
out.writeSmallString(value.toString()); out.writeSmallString(value.toString());
} else { } else {
((ProtobufWriter) out).writeUInt32(value.ordinal()); out.writeUInt32(value.ordinal());
} }
} }

View File

@@ -190,23 +190,21 @@ public class ProtobufFactory extends ConvertFactory<ProtobufReader, ProtobufWrit
if (member == null || first) { if (member == null || first) {
return in; return in;
} }
ProtobufReader reader = (ProtobufReader) in; int tag = in.readTag();
int tag = reader.readTag();
if (tag != member.getTag()) { if (tag != member.getTag()) {
reader.backTag(tag); in.backTag(tag);
return null; return null;
} }
return in; return in;
} else { } else {
ProtobufReader reader = (ProtobufReader) in;
if (!first && member != null) { if (!first && member != null) {
int tag = reader.readTag(); int tag = in.readTag();
if (tag != member.getTag()) { if (tag != member.getTag()) {
reader.backTag(tag); in.backTag(tag);
return null; return null;
} }
} }
byte[] bs = reader.readByteArray(); byte[] bs = in.readByteArray();
return new ProtobufReader(bs); return new ProtobufReader(bs);
} }
} }

View File

@@ -10,7 +10,6 @@ import java.nio.charset.StandardCharsets;
import java.util.*; import java.util.*;
import java.util.concurrent.atomic.*; import java.util.concurrent.atomic.*;
import org.redkale.convert.*; import org.redkale.convert.*;
import org.redkale.util.ObjectPool;
/** @author zhangjx */ /** @author zhangjx */
public class ProtobufReader extends Reader { public class ProtobufReader extends Reader {
@@ -25,12 +24,10 @@ public class ProtobufReader extends Reader {
protected boolean enumtostring; protected boolean enumtostring;
public static ObjectPool<ProtobufReader> createPool(int max) { public ProtobufReader() {
return ObjectPool.createSafePool(max, (Object... params) -> new ProtobufReader(), null, t -> t.recycle()); // do nothing
} }
public ProtobufReader() {}
public ProtobufReader(byte[] bytes) { public ProtobufReader(byte[] bytes) {
setBytes(bytes, 0, bytes.length); setBytes(bytes, 0, bytes.length);
} }

View File

@@ -31,10 +31,6 @@ public class ProtobufWriter extends Writer implements ByteTuple {
protected ProtobufWriter parent; protected ProtobufWriter parent;
public static ObjectPool<ProtobufWriter> createPool(int max) {
return ObjectPool.createSafePool(max, (Object... params) -> new ProtobufWriter(), null, t -> t.recycle());
}
protected ProtobufWriter(ProtobufWriter parent, int features) { protected ProtobufWriter(ProtobufWriter parent, int features) {
this(); this();
this.parent = parent; this.parent = parent;
@@ -484,8 +480,7 @@ public class ProtobufWriter extends Writer implements ByteTuple {
this.writeFieldName(member); this.writeFieldName(member);
ProtobufWriter tmp = new ProtobufWriter().configFieldFunc(this); ProtobufWriter tmp = new ProtobufWriter().configFieldFunc(this);
collectionEncoder.convertTo(tmp, member, (Collection) value); collectionEncoder.convertTo(tmp, member, (Collection) value);
int length = tmp.count(); this.writeLength(tmp.count());
this.writeUInt32(length);
this.writeTo(tmp.toArray()); this.writeTo(tmp.toArray());
} }
} else { } else {
@@ -497,8 +492,7 @@ public class ProtobufWriter extends Writer implements ByteTuple {
this.writeFieldName(member); this.writeFieldName(member);
ProtobufWriter tmp = new ProtobufWriter().configFieldFunc(this); ProtobufWriter tmp = new ProtobufWriter().configFieldFunc(this);
streamEncoder.convertTo(tmp, member, (Stream) value); streamEncoder.convertTo(tmp, member, (Stream) value);
int length = tmp.count(); this.writeLength(tmp.count());
this.writeUInt32(length);
this.writeTo(tmp.toArray()); this.writeTo(tmp.toArray());
} else { } else {
streamEncoder.convertTo(this, member, (Stream) value); streamEncoder.convertTo(this, member, (Stream) value);
@@ -614,6 +608,10 @@ public class ProtobufWriter extends Writer implements ByteTuple {
} }
protected void writeUInt32(int value) { protected void writeUInt32(int value) {
if (value >= 0 && value < 128) {
writeTo((byte) value);
return;
}
while (true) { while (true) {
if ((value & ~0x7F) == 0) { if ((value & ~0x7F) == 0) {
writeTo((byte) value); writeTo((byte) value);

View File

@@ -20,11 +20,8 @@ import org.redkale.util.*;
/** @author zhangjx */ /** @author zhangjx */
public class PBCustMessageTest { public class PBCustMessageTest {
private boolean main;
public static void main(String[] args) throws Throwable { public static void main(String[] args) throws Throwable {
PBCustMessageTest test = new PBCustMessageTest(); PBCustMessageTest test = new PBCustMessageTest();
test.main = true;
test.run(); test.run();
} }
@@ -40,20 +37,19 @@ public class PBCustMessageTest {
byte[] bs2 = ProtobufConvert.root().convertTo(msg2); byte[] bs2 = ProtobufConvert.root().convertTo(msg2);
System.out.println(Arrays.toString(bs1)); System.out.println(Arrays.toString(bs1));
System.out.println(Arrays.toString(bs2)); System.out.println(Arrays.toString(bs2));
if (!main) Assertions.assertEquals(Arrays.toString(bs1), Arrays.toString(bs2)); Assertions.assertEquals(Arrays.toString(bs1), Arrays.toString(bs2));
System.out.println(); System.out.println();
OnPlayerLeaveMessage2 newmsg2 = ProtobufConvert.root().convertFrom(OnPlayerLeaveMessage2.class, bs1); OnPlayerLeaveMessage2 newmsg2 = ProtobufConvert.root().convertFrom(OnPlayerLeaveMessage2.class, bs1);
byte[] newbs2 = ProtobufConvert.root().convertTo(newmsg2); byte[] newbs2 = ProtobufConvert.root().convertTo(newmsg2);
System.out.println(Arrays.toString(newbs2)); System.out.println(Arrays.toString(newbs2));
if (!main) Assertions.assertEquals(Arrays.toString(bs1), Arrays.toString(newbs2)); Assertions.assertEquals(Arrays.toString(bs1), Arrays.toString(newbs2));
System.out.println(); System.out.println();
ProtobufConvert convert = ProtobufConvert.root().newConvert(objFieldFunc); ProtobufConvert convert = ProtobufConvert.root().newConvert(objFieldFunc);
System.out.println(Arrays.toString(convert.convertTo(msg1))); System.out.println(Arrays.toString(convert.convertTo(msg1)));
System.out.println(Arrays.toString(convert.convertTo(msg2))); System.out.println(Arrays.toString(convert.convertTo(msg2)));
if (!main) Assertions.assertEquals(Arrays.toString(convert.convertTo(msg1)), Arrays.toString(convert.convertTo(msg2)));
Assertions.assertEquals(Arrays.toString(convert.convertTo(msg1)), Arrays.toString(convert.convertTo(msg2)));
System.out.println(); System.out.println();
} }

View File

@@ -20,7 +20,7 @@ public class User {
private String name; private String name;
@ConvertColumn(index = 3) @ConvertColumn(index = 3)
private String trueName; private String nickName;
@ConvertColumn(index = 4) @ConvertColumn(index = 4)
private Integer age; private Integer age;
@@ -34,10 +34,10 @@ public class User {
public static User create() { public static User create() {
User user = new User(); User user = new User();
user.setId(1L); user.setId(1L);
user.setName("赵侠客"); // user.setName("Hello");
user.setAge(29); user.setAge(18);
user.setSex(""); user.setSex("");
user.setTrueName("公众"); user.setNickName("测试");
user.setCreateTime(new Date(1451577600000L)); user.setCreateTime(new Date(1451577600000L));
return user; return user;
} }
@@ -58,12 +58,12 @@ public class User {
this.name = name; this.name = name;
} }
public String getTrueName() { public String getNickName() {
return trueName; return nickName;
} }
public void setTrueName(String trueName) { public void setNickName(String nickName) {
this.trueName = trueName; this.nickName = nickName;
} }
public Integer getAge() { public Integer getAge() {

View File

@@ -4,6 +4,7 @@
*/ */
package org.redkale.test.convert.pb; package org.redkale.test.convert.pb;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.redkale.convert.pb.ProtobufConvert; import org.redkale.convert.pb.ProtobufConvert;
@@ -22,6 +23,10 @@ public class UserTest {
public void run() throws Exception { public void run() throws Exception {
User user = User.create(); User user = User.create();
ProtobufConvert convert = ProtobufConvert.root(); ProtobufConvert convert = ProtobufConvert.root();
convert.convertTo(user); byte[] bytes = convert.convertTo(user);
User user2 = convert.convertFrom(User.class, bytes);
System.out.println(user);
System.out.println(user2);
Assertions.assertEquals(user.toString(), user2.toString());
} }
} }