protobuf
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user