diff --git a/src/main/java/org/redkale/convert/ObjectDecoder.java b/src/main/java/org/redkale/convert/ObjectDecoder.java index 931198637..179381b3e 100644 --- a/src/main/java/org/redkale/convert/ObjectDecoder.java +++ b/src/main/java/org/redkale/convert/ObjectDecoder.java @@ -7,7 +7,8 @@ package org.redkale.convert; import java.lang.reflect.*; import java.util.*; -import java.util.concurrent.locks.*; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.ReentrantLock; import org.redkale.annotation.Nullable; import org.redkale.convert.ext.StringSimpledCoder; import org.redkale.util.*; @@ -385,6 +386,7 @@ public class ObjectDecoder implements Decodeable { first = false; } objin.readObjectE(typeClass); + offerReader(in, objin); return result; } else { // 带参数的构造函数 final DeMember[] constructorFields = this.creatorConstructorMembers; @@ -414,6 +416,7 @@ public class ObjectDecoder implements Decodeable { first = false; } objin.readObjectE(typeClass); + offerReader(in, objin); if (this.creator == null) { return null; } @@ -442,6 +445,10 @@ public class ObjectDecoder implements Decodeable { return in; } + protected void offerReader(R parent, R out) { + // do nothing + } + protected Object readDeMemberValue(R in, DeMember member, boolean first) { return member.read(in); } diff --git a/src/main/java/org/redkale/convert/pb/ProtobufCoders.java b/src/main/java/org/redkale/convert/pb/ProtobufCoders.java index 85e6fa071..695df6816 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufCoders.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufCoders.java @@ -4,16 +4,17 @@ */ package org.redkale.convert.pb; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.AtomicLong; +import java.util.Collection; +import java.util.concurrent.atomic.*; import org.redkale.convert.SimpledCoder; -import org.redkale.util.Utility; +import org.redkale.util.*; /** * * @author zhangjx */ -public class ProtobufCoders { +public abstract class ProtobufCoders { + private ProtobufCoders() { // do nothing } @@ -306,4 +307,165 @@ public class ProtobufCoders { return in.readAtomicLongs(); } } + + public static class ProtobufBoolCollectionSimpledCoder + extends SimpledCoder> implements ProtobufPrimitivable { + + private final Creator creator; + + public ProtobufBoolCollectionSimpledCoder(Creator creator) { + this.creator = creator; + } + + @Override + public void convertTo(ProtobufWriter out, Collection values) { + out.writeBools(values); + } + + @Override + public Collection convertFrom(ProtobufReader in) { + return in.readBools(creator); + } + } + + public static class ProtobufByteCollectionSimpledCoder + extends SimpledCoder> implements ProtobufPrimitivable { + + private final Creator creator; + + public ProtobufByteCollectionSimpledCoder(Creator creator) { + this.creator = creator; + } + + @Override + public void convertTo(ProtobufWriter out, Collection values) { + out.writeBytes(values); + } + + @Override + public Collection convertFrom(ProtobufReader in) { + return in.readBytes(creator); + } + } + + public static class ProtobufCharCollectionSimpledCoder + extends SimpledCoder> + implements ProtobufPrimitivable { + + private final Creator creator; + + public ProtobufCharCollectionSimpledCoder(Creator creator) { + this.creator = creator; + } + + @Override + public void convertTo(ProtobufWriter out, Collection values) { + out.writeChars(values); + } + + @Override + public Collection convertFrom(ProtobufReader in) { + return in.readChars(creator); + } + } + + public static class ProtobufShortCollectionSimpledCoder + extends SimpledCoder> implements ProtobufPrimitivable { + + private final Creator creator; + + public ProtobufShortCollectionSimpledCoder(Creator creator) { + this.creator = creator; + } + + @Override + public void convertTo(ProtobufWriter out, Collection values) { + out.writeShorts(values); + } + + @Override + public Collection convertFrom(ProtobufReader in) { + return in.readShorts(creator); + } + } + + public static class ProtobufIntCollectionSimpledCoder + extends SimpledCoder> implements ProtobufPrimitivable { + + private final Creator creator; + + public ProtobufIntCollectionSimpledCoder(Creator creator) { + this.creator = creator; + } + + @Override + public void convertTo(ProtobufWriter out, Collection values) { + out.writeInts(values); + } + + @Override + public Collection convertFrom(ProtobufReader in) { + return in.readInts(creator); + } + } + + public static class ProtobufFloatCollectionSimpledCoder + extends SimpledCoder> implements ProtobufPrimitivable { + + private final Creator creator; + + public ProtobufFloatCollectionSimpledCoder(Creator creator) { + this.creator = creator; + } + + @Override + public void convertTo(ProtobufWriter out, Collection values) { + out.writeFloats(values); + } + + @Override + public Collection convertFrom(ProtobufReader in) { + return in.readFloats(creator); + } + } + + public static class ProtobufLongCollectionSimpledCoder + extends SimpledCoder> implements ProtobufPrimitivable { + + private final Creator creator; + + public ProtobufLongCollectionSimpledCoder(Creator creator) { + this.creator = creator; + } + + @Override + public void convertTo(ProtobufWriter out, Collection values) { + out.writeLongs(values); + } + + @Override + public Collection convertFrom(ProtobufReader in) { + return in.readLongs(creator); + } + } + + public static class ProtobufDoubleCollectionSimpledCoder + extends SimpledCoder> implements ProtobufPrimitivable { + + private final Creator creator; + + public ProtobufDoubleCollectionSimpledCoder(Creator creator) { + this.creator = creator; + } + + @Override + public void convertTo(ProtobufWriter out, Collection values) { + out.writeDoubles(values); + } + + @Override + public Collection convertFrom(ProtobufReader in) { + return in.readDoubles(creator); + } + } } diff --git a/src/main/java/org/redkale/convert/pb/ProtobufFactory.java b/src/main/java/org/redkale/convert/pb/ProtobufFactory.java index 692ad3515..0ae9e561d 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufFactory.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufFactory.java @@ -11,8 +11,32 @@ import java.util.*; import java.util.concurrent.atomic.*; import java.util.stream.Stream; import org.redkale.convert.*; -import org.redkale.util.AnyValue; -import org.redkale.util.AnyValueWriter; +import org.redkale.convert.pb.ProtobufCoders.ProtobufAtomicIntegerArraySimpledCoder; +import org.redkale.convert.pb.ProtobufCoders.ProtobufAtomicLongArraySimpledCoder; +import org.redkale.convert.pb.ProtobufCoders.ProtobufBoolArraySimpledCoder2; +import org.redkale.convert.pb.ProtobufCoders.ProtobufBoolCollectionSimpledCoder; +import org.redkale.convert.pb.ProtobufCoders.ProtobufByteArraySimpledCoder; +import org.redkale.convert.pb.ProtobufCoders.ProtobufByteArraySimpledCoder2; +import org.redkale.convert.pb.ProtobufCoders.ProtobufByteCollectionSimpledCoder; +import org.redkale.convert.pb.ProtobufCoders.ProtobufCharArraySimpledCoder; +import org.redkale.convert.pb.ProtobufCoders.ProtobufCharArraySimpledCoder2; +import org.redkale.convert.pb.ProtobufCoders.ProtobufCharCollectionSimpledCoder; +import org.redkale.convert.pb.ProtobufCoders.ProtobufDoubleArraySimpledCoder; +import org.redkale.convert.pb.ProtobufCoders.ProtobufDoubleArraySimpledCoder2; +import org.redkale.convert.pb.ProtobufCoders.ProtobufDoubleCollectionSimpledCoder; +import org.redkale.convert.pb.ProtobufCoders.ProtobufFloatArraySimpledCoder; +import org.redkale.convert.pb.ProtobufCoders.ProtobufFloatArraySimpledCoder2; +import org.redkale.convert.pb.ProtobufCoders.ProtobufFloatCollectionSimpledCoder; +import org.redkale.convert.pb.ProtobufCoders.ProtobufIntArraySimpledCoder; +import org.redkale.convert.pb.ProtobufCoders.ProtobufIntArraySimpledCoder2; +import org.redkale.convert.pb.ProtobufCoders.ProtobufIntCollectionSimpledCoder; +import org.redkale.convert.pb.ProtobufCoders.ProtobufLongArraySimpledCoder; +import org.redkale.convert.pb.ProtobufCoders.ProtobufLongArraySimpledCoder2; +import org.redkale.convert.pb.ProtobufCoders.ProtobufLongCollectionSimpledCoder; +import org.redkale.convert.pb.ProtobufCoders.ProtobufShortArraySimpledCoder; +import org.redkale.convert.pb.ProtobufCoders.ProtobufShortArraySimpledCoder2; +import org.redkale.convert.pb.ProtobufCoders.ProtobufShortCollectionSimpledCoder; +import org.redkale.util.*; /** @author zhangjx */ public class ProtobufFactory extends ConvertFactory { @@ -42,23 +66,23 @@ public class ProtobufFactory extends ConvertFactory Decodeable createCollectionDecoder(Type type) { + if (type instanceof ParameterizedType) { + ParameterizedType pt = (ParameterizedType) type; + Type componentType = pt.getActualTypeArguments()[0]; + if (componentType == Boolean.class) { + Creator creator = loadCreator((Class) pt.getRawType()); + return (Decodeable) new ProtobufBoolCollectionSimpledCoder(creator); + } else if (componentType == Byte.class) { + Creator creator = loadCreator((Class) pt.getRawType()); + return (Decodeable) new ProtobufByteCollectionSimpledCoder(creator); + } else if (componentType == Character.class) { + Creator creator = loadCreator((Class) pt.getRawType()); + return (Decodeable) new ProtobufCharCollectionSimpledCoder(creator); + } else if (componentType == Short.class) { + Creator creator = loadCreator((Class) pt.getRawType()); + return (Decodeable) new ProtobufShortCollectionSimpledCoder(creator); + } else if (componentType == Integer.class) { + Creator creator = loadCreator((Class) pt.getRawType()); + return (Decodeable) new ProtobufIntCollectionSimpledCoder(creator); + } else if (componentType == Float.class) { + Creator creator = loadCreator((Class) pt.getRawType()); + return (Decodeable) new ProtobufFloatCollectionSimpledCoder(creator); + } else if (componentType == Long.class) { + Creator creator = loadCreator((Class) pt.getRawType()); + return (Decodeable) new ProtobufLongCollectionSimpledCoder(creator); + } else if (componentType == Double.class) { + Creator creator = loadCreator((Class) pt.getRawType()); + return (Decodeable) new ProtobufDoubleCollectionSimpledCoder(creator); + } + } return new ProtobufCollectionDecoder(this, type); } diff --git a/src/main/java/org/redkale/convert/pb/ProtobufReader.java b/src/main/java/org/redkale/convert/pb/ProtobufReader.java index 066b00621..6c6c9e749 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufReader.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufReader.java @@ -11,6 +11,7 @@ import java.util.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import org.redkale.convert.*; +import org.redkale.util.Creator; /** @author zhangjx */ public class ProtobufReader extends Reader { @@ -224,6 +225,15 @@ public class ProtobufReader extends Reader { return data; } + public Collection readBools(Creator creator) { + int size = readRawVarint32(); + Collection data = creator.create(); + for (int i = 0; i < size; i++) { + data.add(readBoolean()); + } + return data; + } + @Override public final byte readByte() { return (byte) readInt(); @@ -233,6 +243,14 @@ public class ProtobufReader extends Reader { return readByteArray(); } + public Collection readBytes(Creator creator) { + Collection data = creator.create(); + for (byte b : readByteArray()) { + data.add(b); + } + return data; + } + @Override public final char readChar() { return (char) readInt(); @@ -253,6 +271,17 @@ public class ProtobufReader extends Reader { return rs; } + public Collection readChars(Creator creator) { + Collection data = creator.create(); + int len = readRawVarint32(); + while (len > 0) { + char val = readChar(); + data.add(val); + len -= ProtobufFactory.computeSInt32SizeNoTag(val); + } + return data; + } + @Override public final short readShort() { return (short) readInt(); @@ -273,6 +302,17 @@ public class ProtobufReader extends Reader { return rs; } + public Collection readShorts(Creator creator) { + Collection data = creator.create(); + int len = readRawVarint32(); + while (len > 0) { + short val = readShort(); + data.add(val); + len -= ProtobufFactory.computeSInt32SizeNoTag(val); + } + return data; + } + @Override public final int readInt() { // readSInt32 int n = readRawVarint32(); @@ -294,6 +334,17 @@ public class ProtobufReader extends Reader { return rs; } + public Collection readInts(Creator creator) { + Collection data = creator.create(); + int len = readRawVarint32(); + while (len > 0) { + int val = readInt(); + data.add(val); + len -= ProtobufFactory.computeSInt32SizeNoTag(val); + } + return data; + } + public AtomicInteger[] readAtomicIntegers() { int len = readRawVarint32(); List list = new ArrayList<>(len); @@ -305,6 +356,17 @@ public class ProtobufReader extends Reader { return list.toArray(new AtomicInteger[list.size()]); } + public Collection readAtomicIntegers(Creator creator) { + Collection data = creator.create(); + int len = readRawVarint32(); + while (len > 0) { + int val = readInt(); + data.add(new AtomicInteger(val)); + len -= ProtobufFactory.computeSInt32SizeNoTag(val); + } + return data; + } + @Override public final float readFloat() { return Float.intBitsToFloat(readRawLittleEndian32()); @@ -319,6 +381,15 @@ public class ProtobufReader extends Reader { return rs; } + public Collection readFloats(Creator creator) { + Collection data = creator.create(); + int len = readRawVarint32() / 4; + for (int i = 0; i < len; i++) { + data.add(readFloat()); + } + return data; + } + @Override public final long readLong() { // readSInt64 long n = readRawVarint64(); @@ -340,6 +411,17 @@ public class ProtobufReader extends Reader { return rs; } + public Collection readLongs(Creator creator) { + Collection data = creator.create(); + int len = readRawVarint32(); + while (len > 0) { + long val = readLong(); + data.add(val); + len -= ProtobufFactory.computeSInt64SizeNoTag(val); + } + return data; + } + public AtomicLong[] readAtomicLongs() { int len = readRawVarint32(); List list = new ArrayList<>(len); @@ -351,6 +433,17 @@ public class ProtobufReader extends Reader { return list.toArray(new AtomicLong[list.size()]); } + public Collection readAtomicLongs(Creator creator) { + Collection data = creator.create(); + int len = readRawVarint32(); + while (len > 0) { + long val = readLong(); + data.add(new AtomicLong(val)); + len -= ProtobufFactory.computeSInt64SizeNoTag(val); + } + return data; + } + @Override public final double readDouble() { return Double.longBitsToDouble(readRawLittleEndian64()); @@ -365,6 +458,15 @@ public class ProtobufReader extends Reader { return rs; } + public Collection readDoubles(Creator creator) { + Collection data = creator.create(); + int len = readRawVarint32() / 8; + for (int i = 0; i < len; i++) { + data.add(readDouble()); + } + return data; + } + @Override public final String readClassName() { return "";