protobuf
This commit is contained in:
@@ -6,7 +6,9 @@
|
|||||||
package org.redkale.convert.bson;
|
package org.redkale.convert.bson;
|
||||||
|
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
|
import java.util.Objects;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
import org.redkale.util.ByteArray;
|
||||||
import org.redkale.util.Utility;
|
import org.redkale.util.Utility;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -49,24 +51,20 @@ public class BsonByteBufferWriter extends BsonWriter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public byte[] toArray() {
|
public ByteArray toByteArray() {
|
||||||
if (buffers == null) {
|
ByteArray array = new ByteArray();
|
||||||
return new byte[0];
|
if (buffers != null) {
|
||||||
|
for (ByteBuffer buf : toBuffers()) {
|
||||||
|
array.put(buf);
|
||||||
|
buf.flip();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
int pos = 0;
|
return array;
|
||||||
byte[] bytes = new byte[this.count];
|
|
||||||
for (ByteBuffer buf : toBuffers()) {
|
|
||||||
int r = buf.remaining();
|
|
||||||
buf.get(bytes, pos, r);
|
|
||||||
buf.flip();
|
|
||||||
pos += r;
|
|
||||||
}
|
|
||||||
return bytes;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return this.getClass().getSimpleName() + "[count=" + this.count + "]";
|
return Objects.toString(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -138,17 +136,22 @@ public class BsonByteBufferWriter extends BsonWriter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public byte[] content() {
|
public final byte[] toArray() {
|
||||||
throw new UnsupportedOperationException("Not supported yet."); // 无需实现
|
throw new UnsupportedOperationException("Not supported yet."); // 无需实现
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int offset() {
|
public final byte[] content() {
|
||||||
throw new UnsupportedOperationException("Not supported yet."); // 无需实现
|
throw new UnsupportedOperationException("Not supported yet."); // 无需实现
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int length() {
|
public final int offset() {
|
||||||
|
throw new UnsupportedOperationException("Not supported yet."); // 无需实现
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final int length() {
|
||||||
throw new UnsupportedOperationException("Not supported yet."); // 无需实现
|
throw new UnsupportedOperationException("Not supported yet."); // 无需实现
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -224,7 +224,7 @@ public class BsonConvert extends BinaryConvert<BsonReader, BsonWriter> {
|
|||||||
@Override
|
@Override
|
||||||
public void convertToBytes(final Type type, final Object value, final ConvertBytesHandler handler) {
|
public void convertToBytes(final Type type, final Object value, final ConvertBytesHandler handler) {
|
||||||
final BsonWriter writer = pollWriter();
|
final BsonWriter writer = pollWriter();
|
||||||
if (type == null && type == null) {
|
if (type == null && value == null) {
|
||||||
writer.writeNull();
|
writer.writeNull();
|
||||||
} else {
|
} else {
|
||||||
factory.loadEncoder(type).convertTo(writer, value);
|
factory.loadEncoder(type).convertTo(writer, value);
|
||||||
|
|||||||
@@ -94,8 +94,10 @@ public class BsonWriter extends Writer implements ByteTuple {
|
|||||||
this.count = array.length();
|
this.count = array.length();
|
||||||
}
|
}
|
||||||
|
|
||||||
public BsonWriter withFeatures(int features) {
|
@Override
|
||||||
return (BsonWriter) super.withFeatures(features);
|
public final BsonWriter withFeatures(int features) {
|
||||||
|
super.withFeatures(features);
|
||||||
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
|||||||
@@ -24,14 +24,14 @@ public class JsonByteBufferReader extends JsonReader {
|
|||||||
|
|
||||||
private ByteBuffer[] buffers;
|
private ByteBuffer[] buffers;
|
||||||
|
|
||||||
private int currentIndex = 0;
|
|
||||||
|
|
||||||
private ByteBuffer currentBuffer;
|
private ByteBuffer currentBuffer;
|
||||||
|
|
||||||
|
private int currBufIndex = 0;
|
||||||
|
|
||||||
protected JsonByteBufferReader(ByteBuffer... buffers) {
|
protected JsonByteBufferReader(ByteBuffer... buffers) {
|
||||||
this.buffers = buffers;
|
this.buffers = buffers;
|
||||||
if (buffers != null && buffers.length > 0) {
|
if (buffers != null && buffers.length > 0) {
|
||||||
this.currentBuffer = buffers[currentIndex];
|
this.currentBuffer = buffers[currBufIndex];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -40,7 +40,7 @@ public class JsonByteBufferReader extends JsonReader {
|
|||||||
super.recycle(); // this.position 初始化值为-1
|
super.recycle(); // this.position 初始化值为-1
|
||||||
this.currentChar = 0;
|
this.currentChar = 0;
|
||||||
this.buffers = null;
|
this.buffers = null;
|
||||||
this.currentIndex = 0;
|
this.currBufIndex = 0;
|
||||||
this.currentBuffer = null;
|
this.currentBuffer = null;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -51,7 +51,7 @@ public class JsonByteBufferReader extends JsonReader {
|
|||||||
return this.currentBuffer.get();
|
return this.currentBuffer.get();
|
||||||
}
|
}
|
||||||
for (; ; ) {
|
for (; ; ) {
|
||||||
this.currentBuffer = this.buffers[++this.currentIndex];
|
this.currentBuffer = this.buffers[++this.currBufIndex];
|
||||||
if (this.currentBuffer.hasRemaining()) {
|
if (this.currentBuffer.hasRemaining()) {
|
||||||
this.position++;
|
this.position++;
|
||||||
return this.currentBuffer.get();
|
return this.currentBuffer.get();
|
||||||
@@ -77,7 +77,7 @@ public class JsonByteBufferReader extends JsonReader {
|
|||||||
}
|
}
|
||||||
if (this.currentBuffer != null) {
|
if (this.currentBuffer != null) {
|
||||||
int remain = this.currentBuffer.remaining();
|
int remain = this.currentBuffer.remaining();
|
||||||
if (remain == 0 && this.currentIndex + 1 >= this.buffers.length) {
|
if (remain == 0 && this.currBufIndex + 1 >= this.buffers.length) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ public class JsonByteBufferWriter extends JsonWriter {
|
|||||||
|
|
||||||
private ByteBuffer[] buffers;
|
private ByteBuffer[] buffers;
|
||||||
|
|
||||||
private int index;
|
private int currBufIndex;
|
||||||
|
|
||||||
public JsonByteBufferWriter(int features, Supplier<ByteBuffer> supplier) {
|
public JsonByteBufferWriter(int features, Supplier<ByteBuffer> supplier) {
|
||||||
this(features, null, supplier);
|
this(features, null, supplier);
|
||||||
@@ -48,7 +48,7 @@ public class JsonByteBufferWriter extends JsonWriter {
|
|||||||
super.recycle();
|
super.recycle();
|
||||||
this.charset = null;
|
this.charset = null;
|
||||||
this.buffers = null;
|
this.buffers = null;
|
||||||
this.index = 0;
|
this.currBufIndex = 0;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -56,7 +56,7 @@ public class JsonByteBufferWriter extends JsonWriter {
|
|||||||
if (buffers == null) {
|
if (buffers == null) {
|
||||||
return new ByteBuffer[0];
|
return new ByteBuffer[0];
|
||||||
}
|
}
|
||||||
for (int i = index; i < this.buffers.length; i++) {
|
for (int i = currBufIndex; i < this.buffers.length; i++) {
|
||||||
ByteBuffer buf = this.buffers[i];
|
ByteBuffer buf = this.buffers[i];
|
||||||
if (buf.position() != 0) {
|
if (buf.position() != 0) {
|
||||||
buf.flip();
|
buf.flip();
|
||||||
@@ -78,15 +78,15 @@ public class JsonByteBufferWriter extends JsonWriter {
|
|||||||
|
|
||||||
private int expand(final int byteLength) {
|
private int expand(final int byteLength) {
|
||||||
if (this.buffers == null) {
|
if (this.buffers == null) {
|
||||||
this.index = 0;
|
this.currBufIndex = 0;
|
||||||
this.buffers = new ByteBuffer[] {supplier.get()};
|
this.buffers = new ByteBuffer[] {supplier.get()};
|
||||||
}
|
}
|
||||||
ByteBuffer buffer = this.buffers[index];
|
ByteBuffer buffer = this.buffers[currBufIndex];
|
||||||
if (!buffer.hasRemaining()) {
|
if (!buffer.hasRemaining()) {
|
||||||
buffer.flip();
|
buffer.flip();
|
||||||
buffer = supplier.get();
|
buffer = supplier.get();
|
||||||
this.buffers = Utility.append(this.buffers, buffer);
|
this.buffers = Utility.append(this.buffers, buffer);
|
||||||
this.index++;
|
this.currBufIndex++;
|
||||||
}
|
}
|
||||||
int len = buffer.remaining();
|
int len = buffer.remaining();
|
||||||
int size = 0;
|
int size = 0;
|
||||||
@@ -105,7 +105,7 @@ public class JsonByteBufferWriter extends JsonWriter {
|
|||||||
throw new ConvertException("writeTo char(int.value = " + (int) ch + ") must be less 127");
|
throw new ConvertException("writeTo char(int.value = " + (int) ch + ") must be less 127");
|
||||||
}
|
}
|
||||||
expand(1);
|
expand(1);
|
||||||
this.buffers[index].put((byte) ch);
|
this.buffers[currBufIndex].put((byte) ch);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -116,16 +116,16 @@ public class JsonByteBufferWriter extends JsonWriter {
|
|||||||
@Override
|
@Override
|
||||||
public void writeTo(final byte ch) { // 只能是 0 - 127 的字符
|
public void writeTo(final byte ch) { // 只能是 0 - 127 的字符
|
||||||
expand(1);
|
expand(1);
|
||||||
this.buffers[index].put(ch);
|
this.buffers[currBufIndex].put(ch);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void writeTo(final byte[] chs, final int start, final int len) { // 只能是 0 - 127 的字符
|
public void writeTo(final byte[] chs, final int start, final int len) { // 只能是 0 - 127 的字符
|
||||||
int expandsize = expand(len);
|
int expandsize = expand(len);
|
||||||
if (expandsize == 0) { // 只需要一个buffer
|
if (expandsize == 0) { // 只需要一个buffer
|
||||||
this.buffers[index].put(chs, start, len);
|
this.buffers[currBufIndex].put(chs, start, len);
|
||||||
} else {
|
} else {
|
||||||
ByteBuffer buffer = this.buffers[index];
|
ByteBuffer buffer = this.buffers[currBufIndex];
|
||||||
int remain = len;
|
int remain = len;
|
||||||
int offset = start;
|
int offset = start;
|
||||||
while (remain > 0) {
|
while (remain > 0) {
|
||||||
@@ -154,7 +154,7 @@ public class JsonByteBufferWriter extends JsonWriter {
|
|||||||
expandsize = expand(byteLength);
|
expandsize = expand(byteLength);
|
||||||
}
|
}
|
||||||
if (expandsize == 0) { // 只需要一个buffer
|
if (expandsize == 0) { // 只需要一个buffer
|
||||||
final ByteBuffer buffer = this.buffers[index];
|
final ByteBuffer buffer = this.buffers[currBufIndex];
|
||||||
if (quote) {
|
if (quote) {
|
||||||
buffer.put((byte) '"');
|
buffer.put((byte) '"');
|
||||||
}
|
}
|
||||||
@@ -190,7 +190,7 @@ public class JsonByteBufferWriter extends JsonWriter {
|
|||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ByteBuffer buffer = this.buffers[index];
|
ByteBuffer buffer = this.buffers[currBufIndex];
|
||||||
if (quote) {
|
if (quote) {
|
||||||
if (!buffer.hasRemaining()) {
|
if (!buffer.hasRemaining()) {
|
||||||
buffer = nextByteBuffer();
|
buffer = nextByteBuffer();
|
||||||
@@ -266,8 +266,8 @@ public class JsonByteBufferWriter extends JsonWriter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private ByteBuffer nextByteBuffer() {
|
private ByteBuffer nextByteBuffer() {
|
||||||
this.buffers[this.index].flip();
|
this.buffers[this.currBufIndex].flip();
|
||||||
return this.buffers[++this.index];
|
return this.buffers[++this.currBufIndex];
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static int encodeEscapeUTF8Length(final char[] text, final int start, final int len) {
|
protected static int encodeEscapeUTF8Length(final char[] text, final int start, final int len) {
|
||||||
@@ -316,7 +316,7 @@ public class JsonByteBufferWriter extends JsonWriter {
|
|||||||
byte[] bs = Utility.latin1ByteArray(value);
|
byte[] bs = Utility.latin1ByteArray(value);
|
||||||
int expandsize = expand(bs.length + (quote ? 2 : 0));
|
int expandsize = expand(bs.length + (quote ? 2 : 0));
|
||||||
if (expandsize == 0) { // 只需要一个buffer
|
if (expandsize == 0) { // 只需要一个buffer
|
||||||
final ByteBuffer buffer = this.buffers[index];
|
final ByteBuffer buffer = this.buffers[currBufIndex];
|
||||||
if (quote) {
|
if (quote) {
|
||||||
buffer.put((byte) '"');
|
buffer.put((byte) '"');
|
||||||
}
|
}
|
||||||
@@ -325,7 +325,7 @@ public class JsonByteBufferWriter extends JsonWriter {
|
|||||||
buffer.put((byte) '"');
|
buffer.put((byte) '"');
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ByteBuffer buffer = this.buffers[index];
|
ByteBuffer buffer = this.buffers[currBufIndex];
|
||||||
if (quote) {
|
if (quote) {
|
||||||
if (!buffer.hasRemaining()) {
|
if (!buffer.hasRemaining()) {
|
||||||
buffer = nextByteBuffer();
|
buffer = nextByteBuffer();
|
||||||
@@ -353,11 +353,11 @@ public class JsonByteBufferWriter extends JsonWriter {
|
|||||||
byte[] bs2 = Utility.latin1ByteArray(String.valueOf(value));
|
byte[] bs2 = Utility.latin1ByteArray(String.valueOf(value));
|
||||||
int expandsize = expand(bs1.length + bs2.length);
|
int expandsize = expand(bs1.length + bs2.length);
|
||||||
if (expandsize == 0) { // 只需要一个buffer
|
if (expandsize == 0) { // 只需要一个buffer
|
||||||
final ByteBuffer buffer = this.buffers[index];
|
final ByteBuffer buffer = this.buffers[currBufIndex];
|
||||||
buffer.put(bs1);
|
buffer.put(bs1);
|
||||||
buffer.put(bs2);
|
buffer.put(bs2);
|
||||||
} else {
|
} else {
|
||||||
ByteBuffer buffer = this.buffers[index];
|
ByteBuffer buffer = this.buffers[currBufIndex];
|
||||||
for (byte b : bs1) {
|
for (byte b : bs1) {
|
||||||
if (!buffer.hasRemaining()) {
|
if (!buffer.hasRemaining()) {
|
||||||
buffer = nextByteBuffer();
|
buffer = nextByteBuffer();
|
||||||
@@ -379,11 +379,11 @@ public class JsonByteBufferWriter extends JsonWriter {
|
|||||||
byte[] bs2 = Utility.latin1ByteArray(String.valueOf(value));
|
byte[] bs2 = Utility.latin1ByteArray(String.valueOf(value));
|
||||||
int expandsize = expand(bs1.length + bs2.length);
|
int expandsize = expand(bs1.length + bs2.length);
|
||||||
if (expandsize == 0) { // 只需要一个buffer
|
if (expandsize == 0) { // 只需要一个buffer
|
||||||
final ByteBuffer buffer = this.buffers[index];
|
final ByteBuffer buffer = this.buffers[currBufIndex];
|
||||||
buffer.put(bs1);
|
buffer.put(bs1);
|
||||||
buffer.put(bs2);
|
buffer.put(bs2);
|
||||||
} else {
|
} else {
|
||||||
ByteBuffer buffer = this.buffers[index];
|
ByteBuffer buffer = this.buffers[currBufIndex];
|
||||||
for (byte b : bs1) {
|
for (byte b : bs1) {
|
||||||
if (!buffer.hasRemaining()) {
|
if (!buffer.hasRemaining()) {
|
||||||
buffer = nextByteBuffer();
|
buffer = nextByteBuffer();
|
||||||
@@ -405,11 +405,11 @@ public class JsonByteBufferWriter extends JsonWriter {
|
|||||||
byte[] bs2 = Utility.latin1ByteArray(String.valueOf(value));
|
byte[] bs2 = Utility.latin1ByteArray(String.valueOf(value));
|
||||||
int expandsize = expand(bs1.length + bs2.length);
|
int expandsize = expand(bs1.length + bs2.length);
|
||||||
if (expandsize == 0) { // 只需要一个buffer
|
if (expandsize == 0) { // 只需要一个buffer
|
||||||
final ByteBuffer buffer = this.buffers[index];
|
final ByteBuffer buffer = this.buffers[currBufIndex];
|
||||||
buffer.put(bs1);
|
buffer.put(bs1);
|
||||||
buffer.put(bs2);
|
buffer.put(bs2);
|
||||||
} else {
|
} else {
|
||||||
ByteBuffer buffer = this.buffers[index];
|
ByteBuffer buffer = this.buffers[currBufIndex];
|
||||||
for (byte b : bs1) {
|
for (byte b : bs1) {
|
||||||
if (!buffer.hasRemaining()) {
|
if (!buffer.hasRemaining()) {
|
||||||
buffer = nextByteBuffer();
|
buffer = nextByteBuffer();
|
||||||
@@ -431,13 +431,13 @@ public class JsonByteBufferWriter extends JsonWriter {
|
|||||||
byte[] bs2 = Utility.latin1ByteArray(value);
|
byte[] bs2 = Utility.latin1ByteArray(value);
|
||||||
int expandsize = expand(bs1.length + bs2.length + 2);
|
int expandsize = expand(bs1.length + bs2.length + 2);
|
||||||
if (expandsize == 0) { // 只需要一个buffer
|
if (expandsize == 0) { // 只需要一个buffer
|
||||||
final ByteBuffer buffer = this.buffers[index];
|
final ByteBuffer buffer = this.buffers[currBufIndex];
|
||||||
buffer.put(bs1);
|
buffer.put(bs1);
|
||||||
buffer.put((byte) '"');
|
buffer.put((byte) '"');
|
||||||
buffer.put(bs2);
|
buffer.put(bs2);
|
||||||
buffer.put((byte) '"');
|
buffer.put((byte) '"');
|
||||||
} else {
|
} else {
|
||||||
ByteBuffer buffer = this.buffers[index];
|
ByteBuffer buffer = this.buffers[currBufIndex];
|
||||||
for (byte b : bs1) {
|
for (byte b : bs1) {
|
||||||
if (!buffer.hasRemaining()) {
|
if (!buffer.hasRemaining()) {
|
||||||
buffer = nextByteBuffer();
|
buffer = nextByteBuffer();
|
||||||
@@ -471,12 +471,12 @@ public class JsonByteBufferWriter extends JsonWriter {
|
|||||||
byte[] bs2 = Utility.latin1ByteArray(String.valueOf(value));
|
byte[] bs2 = Utility.latin1ByteArray(String.valueOf(value));
|
||||||
int expandsize = expand(bs1.length + bs2.length + 1);
|
int expandsize = expand(bs1.length + bs2.length + 1);
|
||||||
if (expandsize == 0) { // 只需要一个buffer
|
if (expandsize == 0) { // 只需要一个buffer
|
||||||
final ByteBuffer buffer = this.buffers[index];
|
final ByteBuffer buffer = this.buffers[currBufIndex];
|
||||||
buffer.put(bs1);
|
buffer.put(bs1);
|
||||||
buffer.put(bs2);
|
buffer.put(bs2);
|
||||||
buffer.put((byte) '}');
|
buffer.put((byte) '}');
|
||||||
} else {
|
} else {
|
||||||
ByteBuffer buffer = this.buffers[index];
|
ByteBuffer buffer = this.buffers[currBufIndex];
|
||||||
for (byte b : bs1) {
|
for (byte b : bs1) {
|
||||||
if (!buffer.hasRemaining()) {
|
if (!buffer.hasRemaining()) {
|
||||||
buffer = nextByteBuffer();
|
buffer = nextByteBuffer();
|
||||||
@@ -504,12 +504,12 @@ public class JsonByteBufferWriter extends JsonWriter {
|
|||||||
byte[] bs2 = Utility.latin1ByteArray(String.valueOf(value));
|
byte[] bs2 = Utility.latin1ByteArray(String.valueOf(value));
|
||||||
int expandsize = expand(bs1.length + bs2.length + 1);
|
int expandsize = expand(bs1.length + bs2.length + 1);
|
||||||
if (expandsize == 0) { // 只需要一个buffer
|
if (expandsize == 0) { // 只需要一个buffer
|
||||||
final ByteBuffer buffer = this.buffers[index];
|
final ByteBuffer buffer = this.buffers[currBufIndex];
|
||||||
buffer.put(bs1);
|
buffer.put(bs1);
|
||||||
buffer.put(bs2);
|
buffer.put(bs2);
|
||||||
buffer.put((byte) '}');
|
buffer.put((byte) '}');
|
||||||
} else {
|
} else {
|
||||||
ByteBuffer buffer = this.buffers[index];
|
ByteBuffer buffer = this.buffers[currBufIndex];
|
||||||
for (byte b : bs1) {
|
for (byte b : bs1) {
|
||||||
if (!buffer.hasRemaining()) {
|
if (!buffer.hasRemaining()) {
|
||||||
buffer = nextByteBuffer();
|
buffer = nextByteBuffer();
|
||||||
@@ -537,12 +537,12 @@ public class JsonByteBufferWriter extends JsonWriter {
|
|||||||
byte[] bs2 = Utility.latin1ByteArray(String.valueOf(value));
|
byte[] bs2 = Utility.latin1ByteArray(String.valueOf(value));
|
||||||
int expandsize = expand(bs1.length + bs2.length + 1);
|
int expandsize = expand(bs1.length + bs2.length + 1);
|
||||||
if (expandsize == 0) { // 只需要一个buffer
|
if (expandsize == 0) { // 只需要一个buffer
|
||||||
final ByteBuffer buffer = this.buffers[index];
|
final ByteBuffer buffer = this.buffers[currBufIndex];
|
||||||
buffer.put(bs1);
|
buffer.put(bs1);
|
||||||
buffer.put(bs2);
|
buffer.put(bs2);
|
||||||
buffer.put((byte) '}');
|
buffer.put((byte) '}');
|
||||||
} else {
|
} else {
|
||||||
ByteBuffer buffer = this.buffers[index];
|
ByteBuffer buffer = this.buffers[currBufIndex];
|
||||||
for (byte b : bs1) {
|
for (byte b : bs1) {
|
||||||
if (!buffer.hasRemaining()) {
|
if (!buffer.hasRemaining()) {
|
||||||
buffer = nextByteBuffer();
|
buffer = nextByteBuffer();
|
||||||
@@ -574,20 +574,20 @@ public class JsonByteBufferWriter extends JsonWriter {
|
|||||||
}
|
}
|
||||||
if (value == null || (tiny() && value.isEmpty())) {
|
if (value == null || (tiny() && value.isEmpty())) {
|
||||||
expand(1);
|
expand(1);
|
||||||
this.buffers[index].put((byte) '}');
|
this.buffers[currBufIndex].put((byte) '}');
|
||||||
} else {
|
} else {
|
||||||
byte[] bs1 = fieldBytes;
|
byte[] bs1 = fieldBytes;
|
||||||
byte[] bs2 = Utility.latin1ByteArray(value);
|
byte[] bs2 = Utility.latin1ByteArray(value);
|
||||||
int expandsize = expand(bs1.length + bs2.length + 3);
|
int expandsize = expand(bs1.length + bs2.length + 3);
|
||||||
if (expandsize == 0) { // 只需要一个buffer
|
if (expandsize == 0) { // 只需要一个buffer
|
||||||
final ByteBuffer buffer = this.buffers[index];
|
final ByteBuffer buffer = this.buffers[currBufIndex];
|
||||||
buffer.put(bs1);
|
buffer.put(bs1);
|
||||||
buffer.put((byte) '"');
|
buffer.put((byte) '"');
|
||||||
buffer.put(bs2);
|
buffer.put(bs2);
|
||||||
buffer.put((byte) '"');
|
buffer.put((byte) '"');
|
||||||
buffer.put((byte) '}');
|
buffer.put((byte) '}');
|
||||||
} else {
|
} else {
|
||||||
ByteBuffer buffer = this.buffers[index];
|
ByteBuffer buffer = this.buffers[currBufIndex];
|
||||||
for (byte b : bs1) {
|
for (byte b : bs1) {
|
||||||
if (!buffer.hasRemaining()) {
|
if (!buffer.hasRemaining()) {
|
||||||
buffer = nextByteBuffer();
|
buffer = nextByteBuffer();
|
||||||
@@ -635,11 +635,11 @@ public class JsonByteBufferWriter extends JsonWriter {
|
|||||||
if (value == null || (tiny() && value.isEmpty())) {
|
if (value == null || (tiny() && value.isEmpty())) {
|
||||||
int expandsize = expand(2);
|
int expandsize = expand(2);
|
||||||
if (expandsize == 0) { // 只需要一个buffer
|
if (expandsize == 0) { // 只需要一个buffer
|
||||||
ByteBuffer bb = this.buffers[index];
|
ByteBuffer bb = this.buffers[currBufIndex];
|
||||||
bb.put((byte) '{');
|
bb.put((byte) '{');
|
||||||
bb.put((byte) '}');
|
bb.put((byte) '}');
|
||||||
} else {
|
} else {
|
||||||
ByteBuffer bb = this.buffers[index];
|
ByteBuffer bb = this.buffers[currBufIndex];
|
||||||
bb.put((byte) '{');
|
bb.put((byte) '{');
|
||||||
bb = nextByteBuffer();
|
bb = nextByteBuffer();
|
||||||
bb.put((byte) '}');
|
bb.put((byte) '}');
|
||||||
@@ -649,14 +649,14 @@ public class JsonByteBufferWriter extends JsonWriter {
|
|||||||
byte[] bs2 = Utility.latin1ByteArray(value);
|
byte[] bs2 = Utility.latin1ByteArray(value);
|
||||||
int expandsize = expand(bs1.length + bs2.length + 3);
|
int expandsize = expand(bs1.length + bs2.length + 3);
|
||||||
if (expandsize == 0) { // 只需要一个buffer
|
if (expandsize == 0) { // 只需要一个buffer
|
||||||
final ByteBuffer buffer = this.buffers[index];
|
final ByteBuffer buffer = this.buffers[currBufIndex];
|
||||||
buffer.put(bs1);
|
buffer.put(bs1);
|
||||||
buffer.put((byte) '"');
|
buffer.put((byte) '"');
|
||||||
buffer.put(bs2);
|
buffer.put(bs2);
|
||||||
buffer.put((byte) '"');
|
buffer.put((byte) '"');
|
||||||
buffer.put((byte) '}');
|
buffer.put((byte) '}');
|
||||||
} else {
|
} else {
|
||||||
ByteBuffer buffer = this.buffers[index];
|
ByteBuffer buffer = this.buffers[currBufIndex];
|
||||||
for (byte b : bs1) {
|
for (byte b : bs1) {
|
||||||
if (!buffer.hasRemaining()) {
|
if (!buffer.hasRemaining()) {
|
||||||
buffer = nextByteBuffer();
|
buffer = nextByteBuffer();
|
||||||
@@ -705,14 +705,14 @@ public class JsonByteBufferWriter extends JsonWriter {
|
|||||||
byte[] bs4 = Utility.latin1ByteArray(String.valueOf(value2));
|
byte[] bs4 = Utility.latin1ByteArray(String.valueOf(value2));
|
||||||
int expandsize = expand(bs1.length + bs2.length + bs3.length + bs4.length + 1);
|
int expandsize = expand(bs1.length + bs2.length + bs3.length + bs4.length + 1);
|
||||||
if (expandsize == 0) { // 只需要一个buffer
|
if (expandsize == 0) { // 只需要一个buffer
|
||||||
final ByteBuffer buffer = this.buffers[index];
|
final ByteBuffer buffer = this.buffers[currBufIndex];
|
||||||
buffer.put(bs1);
|
buffer.put(bs1);
|
||||||
buffer.put(bs2);
|
buffer.put(bs2);
|
||||||
buffer.put(bs3);
|
buffer.put(bs3);
|
||||||
buffer.put(bs4);
|
buffer.put(bs4);
|
||||||
buffer.put((byte) '}');
|
buffer.put((byte) '}');
|
||||||
} else {
|
} else {
|
||||||
ByteBuffer buffer = this.buffers[index];
|
ByteBuffer buffer = this.buffers[currBufIndex];
|
||||||
for (byte b : bs1) {
|
for (byte b : bs1) {
|
||||||
if (!buffer.hasRemaining()) {
|
if (!buffer.hasRemaining()) {
|
||||||
buffer = nextByteBuffer();
|
buffer = nextByteBuffer();
|
||||||
@@ -805,7 +805,7 @@ public class JsonByteBufferWriter extends JsonWriter {
|
|||||||
final int byteLength = 2 + encodeEscapeUTF8Length(chs, 0, chs.length);
|
final int byteLength = 2 + encodeEscapeUTF8Length(chs, 0, chs.length);
|
||||||
expandsize = expand(byteLength);
|
expandsize = expand(byteLength);
|
||||||
if (expandsize == 0) { // 只需要一个buffer
|
if (expandsize == 0) { // 只需要一个buffer
|
||||||
final ByteBuffer buffer = this.buffers[index];
|
final ByteBuffer buffer = this.buffers[currBufIndex];
|
||||||
if (quote) {
|
if (quote) {
|
||||||
buffer.put((byte) '"');
|
buffer.put((byte) '"');
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ public class ProtobufArrayEncoder<T> extends ArrayEncoder<ProtobufWriter, T> {
|
|||||||
|
|
||||||
public ProtobufArrayEncoder(ProtobufFactory factory, Type type) {
|
public ProtobufArrayEncoder(ProtobufFactory factory, Type type) {
|
||||||
super(factory, type);
|
super(factory, type);
|
||||||
this.componentSimpled = getComponentEncoder()instanceof SimpledCoder;
|
this.componentSimpled = getComponentEncoder() instanceof SimpledCoder;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -40,8 +40,7 @@ public class ProtobufArrayEncoder<T> extends ArrayEncoder<ProtobufWriter, T> {
|
|||||||
} else {
|
} else {
|
||||||
ProtobufWriter tmp = out.pollChild();
|
ProtobufWriter tmp = out.pollChild();
|
||||||
itemEncoder.convertTo(tmp, item);
|
itemEncoder.convertTo(tmp, item);
|
||||||
out.writeLength(tmp.count());
|
out.writeTuple(tmp);
|
||||||
out.writeTo(tmp.toArray());
|
|
||||||
out.offerChild(tmp);
|
out.offerChild(tmp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,17 +17,21 @@ public class ProtobufByteBufferReader extends ProtobufReader {
|
|||||||
|
|
||||||
private ByteBuffer currentBuffer;
|
private ByteBuffer currentBuffer;
|
||||||
|
|
||||||
private int currentIndex = 0;
|
private int currBufIndex = 0;
|
||||||
|
|
||||||
|
protected ProtobufByteBufferReader() {
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
|
|
||||||
protected ProtobufByteBufferReader(ByteBuffer... buffers) {
|
protected ProtobufByteBufferReader(ByteBuffer... buffers) {
|
||||||
this.buffers = buffers;
|
this.buffers = buffers;
|
||||||
this.currentBuffer = buffers[currentIndex];
|
this.currentBuffer = buffers[currBufIndex];
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean recycle() {
|
protected boolean recycle() {
|
||||||
super.recycle();
|
super.recycle();
|
||||||
this.currentIndex = 0;
|
this.currBufIndex = 0;
|
||||||
this.currentBuffer = null;
|
this.currentBuffer = null;
|
||||||
this.buffers = null;
|
this.buffers = null;
|
||||||
return false;
|
return false;
|
||||||
@@ -39,7 +43,7 @@ public class ProtobufByteBufferReader extends ProtobufReader {
|
|||||||
return this.currentBuffer.get();
|
return this.currentBuffer.get();
|
||||||
}
|
}
|
||||||
for (; ; ) {
|
for (; ; ) {
|
||||||
this.currentBuffer = this.buffers[++this.currentIndex];
|
this.currentBuffer = this.buffers[++this.currBufIndex];
|
||||||
if (this.currentBuffer.hasRemaining()) {
|
if (this.currentBuffer.hasRemaining()) {
|
||||||
this.position++;
|
this.position++;
|
||||||
return this.currentBuffer.get();
|
return this.currentBuffer.get();
|
||||||
@@ -67,8 +71,8 @@ public class ProtobufByteBufferReader extends ProtobufReader {
|
|||||||
array.put(currentBuffer);
|
array.put(currentBuffer);
|
||||||
}
|
}
|
||||||
int end = buffers.length - 1;
|
int end = buffers.length - 1;
|
||||||
while (this.currentIndex < end) {
|
while (this.currBufIndex < end) {
|
||||||
this.currentBuffer = this.buffers[++this.currentIndex];
|
this.currentBuffer = this.buffers[++this.currBufIndex];
|
||||||
array.put(currentBuffer);
|
array.put(currentBuffer);
|
||||||
}
|
}
|
||||||
return array.getBytes();
|
return array.getBytes();
|
||||||
@@ -83,8 +87,8 @@ public class ProtobufByteBufferReader extends ProtobufReader {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
int end = buffers.length - 1;
|
int end = buffers.length - 1;
|
||||||
while (this.currentIndex < end) {
|
while (this.currBufIndex < end) {
|
||||||
this.currentBuffer = this.buffers[++this.currentIndex];
|
this.currentBuffer = this.buffers[++this.currBufIndex];
|
||||||
if (this.currentBuffer.hasRemaining()) {
|
if (this.currentBuffer.hasRemaining()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
package org.redkale.convert.pb;
|
package org.redkale.convert.pb;
|
||||||
|
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
|
import java.util.Objects;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
import org.redkale.util.Utility;
|
import org.redkale.util.Utility;
|
||||||
|
|
||||||
@@ -16,7 +17,7 @@ public class ProtobufByteBufferWriter extends ProtobufWriter {
|
|||||||
|
|
||||||
private ByteBuffer[] buffers;
|
private ByteBuffer[] buffers;
|
||||||
|
|
||||||
private int index;
|
private int currBufIndex;
|
||||||
|
|
||||||
public ProtobufByteBufferWriter(int features, boolean enumtostring, Supplier<ByteBuffer> supplier) {
|
public ProtobufByteBufferWriter(int features, boolean enumtostring, Supplier<ByteBuffer> supplier) {
|
||||||
super((byte[]) null);
|
super((byte[]) null);
|
||||||
@@ -29,7 +30,7 @@ public class ProtobufByteBufferWriter extends ProtobufWriter {
|
|||||||
protected boolean recycle() {
|
protected boolean recycle() {
|
||||||
super.recycle();
|
super.recycle();
|
||||||
this.buffers = null;
|
this.buffers = null;
|
||||||
this.index = 0;
|
this.currBufIndex = 0;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -38,7 +39,7 @@ public class ProtobufByteBufferWriter extends ProtobufWriter {
|
|||||||
if (buffers == null) {
|
if (buffers == null) {
|
||||||
return new ByteBuffer[0];
|
return new ByteBuffer[0];
|
||||||
}
|
}
|
||||||
for (int i = index; i < this.buffers.length; i++) {
|
for (int i = currBufIndex; i < this.buffers.length; i++) {
|
||||||
ByteBuffer buf = this.buffers[i];
|
ByteBuffer buf = this.buffers[i];
|
||||||
if (buf.position() != 0) {
|
if (buf.position() != 0) {
|
||||||
buf.flip();
|
buf.flip();
|
||||||
@@ -47,39 +48,18 @@ public class ProtobufByteBufferWriter extends ProtobufWriter {
|
|||||||
return this.buffers;
|
return this.buffers;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public byte[] toArray() {
|
|
||||||
if (buffers == null) {
|
|
||||||
return new byte[0];
|
|
||||||
}
|
|
||||||
int pos = 0;
|
|
||||||
byte[] bytes = new byte[this.count];
|
|
||||||
for (ByteBuffer buf : toBuffers()) {
|
|
||||||
int r = buf.remaining();
|
|
||||||
buf.get(bytes, pos, r);
|
|
||||||
buf.flip();
|
|
||||||
pos += r;
|
|
||||||
}
|
|
||||||
return bytes;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return this.getClass().getSimpleName() + "[count=" + this.count + "]";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected int expand(final int byteLength) {
|
protected int expand(final int byteLength) {
|
||||||
if (this.buffers == null) {
|
if (this.buffers == null) {
|
||||||
this.index = 0;
|
this.currBufIndex = 0;
|
||||||
this.buffers = new ByteBuffer[] {supplier.get()};
|
this.buffers = new ByteBuffer[] {supplier.get()};
|
||||||
}
|
}
|
||||||
ByteBuffer buffer = this.buffers[index];
|
ByteBuffer buffer = this.buffers[currBufIndex];
|
||||||
if (!buffer.hasRemaining()) {
|
if (!buffer.hasRemaining()) {
|
||||||
buffer.flip();
|
buffer.flip();
|
||||||
buffer = supplier.get();
|
buffer = supplier.get();
|
||||||
this.buffers = Utility.append(this.buffers, buffer);
|
this.buffers = Utility.append(this.buffers, buffer);
|
||||||
this.index++;
|
this.currBufIndex++;
|
||||||
}
|
}
|
||||||
int len = buffer.remaining();
|
int len = buffer.remaining();
|
||||||
int size = 0;
|
int size = 0;
|
||||||
@@ -92,19 +72,26 @@ public class ProtobufByteBufferWriter extends ProtobufWriter {
|
|||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeTo(final byte ch) {
|
||||||
|
expand(1);
|
||||||
|
this.buffers[currBufIndex].put(ch);
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void writeTo(final byte[] chs, final int start, final int len) {
|
public void writeTo(final byte[] chs, final int start, final int len) {
|
||||||
if (expand(len) == 0) {
|
if (expand(len) == 0) {
|
||||||
this.buffers[index].put(chs, start, len);
|
this.buffers[currBufIndex].put(chs, start, len);
|
||||||
} else {
|
} else {
|
||||||
ByteBuffer buffer = this.buffers[index];
|
ByteBuffer buffer = this.buffers[currBufIndex];
|
||||||
final int end = start + len;
|
final int end = start + len;
|
||||||
int remain = len; // 还剩多少没有写
|
int remain = len; // 还剩多少没有写
|
||||||
while (remain > 0) {
|
while (remain > 0) {
|
||||||
final int br = buffer.remaining();
|
final int br = buffer.remaining();
|
||||||
if (remain > br) { // 一个buffer写不完
|
if (remain > br) { // 一个buffer写不完
|
||||||
buffer.put(chs, end - remain, br);
|
buffer.put(chs, end - remain, br).flip();
|
||||||
buffer = nextByteBuffer();
|
buffer = this.buffers[++this.currBufIndex];
|
||||||
remain -= br;
|
remain -= br;
|
||||||
} else {
|
} else {
|
||||||
buffer.put(chs, end - remain, remain);
|
buffer.put(chs, end - remain, remain);
|
||||||
@@ -115,30 +102,63 @@ public class ProtobufByteBufferWriter extends ProtobufWriter {
|
|||||||
this.count += len;
|
this.count += len;
|
||||||
}
|
}
|
||||||
|
|
||||||
private ByteBuffer nextByteBuffer() {
|
@Override
|
||||||
this.buffers[this.index].flip();
|
protected final void writeUInt32(int value) {
|
||||||
return this.buffers[++this.index];
|
if (value >= 0 && value < TENTHOUSAND_MAX) {
|
||||||
|
writeTo(TENTHOUSAND_UINT_BYTES[value]);
|
||||||
|
return;
|
||||||
|
} else if (value < 0 && value > TENTHOUSAND_MAX) {
|
||||||
|
writeTo(TENTHOUSAND_UINT_BYTES2[-value]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
while (true) {
|
||||||
|
if ((value & ~0x7F) == 0) {
|
||||||
|
writeTo((byte) value);
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
writeTo((byte) ((value & 0x7F) | 0x80));
|
||||||
|
value >>>= 7;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void writeTo(final byte ch) {
|
protected final void writeUInt64(long value) {
|
||||||
expand(1);
|
if (value >= 0 && value < TENTHOUSAND_MAX) {
|
||||||
this.buffers[index].put(ch);
|
writeTo(TENTHOUSAND_UINT_BYTES[(int) value]);
|
||||||
count++;
|
return;
|
||||||
|
} else if (value < 0 && value > TENTHOUSAND_MAX) {
|
||||||
|
writeTo(TENTHOUSAND_UINT_BYTES2[(int) -value]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
while (true) {
|
||||||
|
if ((value & ~0x7FL) == 0) {
|
||||||
|
writeTo((byte) value);
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
writeTo((byte) ((value & 0x7F) | 0x80));
|
||||||
|
value >>>= 7;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public byte[] content() {
|
public String toString() {
|
||||||
|
return Objects.toString(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final ProtobufWriter clear() {
|
||||||
throw new UnsupportedOperationException("Not supported yet."); // 无需实现
|
throw new UnsupportedOperationException("Not supported yet."); // 无需实现
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int offset() {
|
public final byte[] toArray() {
|
||||||
throw new UnsupportedOperationException("Not supported yet."); // 无需实现
|
throw new UnsupportedOperationException("Not supported yet."); // 无需实现
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int length() {
|
public final byte[] content() {
|
||||||
throw new UnsupportedOperationException("Not supported yet."); // 无需实现
|
throw new UnsupportedOperationException("Not supported yet."); // 无需实现
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ import org.redkale.util.*;
|
|||||||
*/
|
*/
|
||||||
public abstract class ProtobufCoders {
|
public abstract class ProtobufCoders {
|
||||||
|
|
||||||
private static final Creator<List> LIST_CREATOR = Creator.load(List.class);
|
static final Creator<List> LIST_CREATOR = Creator.load(List.class);
|
||||||
|
|
||||||
private ProtobufCoders() {
|
private ProtobufCoders() {
|
||||||
// do nothing
|
// do nothing
|
||||||
|
|||||||
@@ -39,8 +39,7 @@ public class ProtobufCollectionEncoder<T> extends CollectionEncoder<ProtobufWrit
|
|||||||
} else {
|
} else {
|
||||||
ProtobufWriter tmp = out.pollChild();
|
ProtobufWriter tmp = out.pollChild();
|
||||||
itemEncoder.convertTo(tmp, item);
|
itemEncoder.convertTo(tmp, item);
|
||||||
out.writeLength(tmp.count());
|
out.writeTuple(tmp);
|
||||||
out.writeTo(tmp.toArray());
|
|
||||||
out.offerChild(tmp);
|
out.offerChild(tmp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -105,8 +105,7 @@ public class ProtobufConvert extends BinaryConvert<ProtobufReader, ProtobufWrite
|
|||||||
// ------------------------------ writer -----------------------------------------------------------
|
// ------------------------------ writer -----------------------------------------------------------
|
||||||
@Override
|
@Override
|
||||||
protected <S extends ProtobufWriter> S configWrite(S writer) {
|
protected <S extends ProtobufWriter> S configWrite(S writer) {
|
||||||
writer.initOffset = writer.count;
|
return (S) writer.configWrite();
|
||||||
return writer;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ProtobufByteBufferWriter pollProtobufWriter(final Supplier<ByteBuffer> supplier) {
|
public ProtobufByteBufferWriter pollProtobufWriter(final Supplier<ByteBuffer> supplier) {
|
||||||
@@ -826,7 +825,7 @@ public class ProtobufConvert extends BinaryConvert<ProtobufReader, ProtobufWrite
|
|||||||
writer.writeNull();
|
writer.writeNull();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
writer.initOffset = writer.count;
|
writer.configWrite();
|
||||||
final Type t = type == null ? value.getClass() : type;
|
final Type t = type == null ? value.getClass() : type;
|
||||||
Encodeable encoder = this.lastEncodeable;
|
Encodeable encoder = this.lastEncodeable;
|
||||||
if (encoder == null || encoder.getType() != t) {
|
if (encoder == null || encoder.getType() != t) {
|
||||||
|
|||||||
@@ -227,6 +227,32 @@ public class ProtobufFactory extends ConvertFactory<ProtobufReader, ProtobufWrit
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected <E> Encodeable<ProtobufWriter, E> createCollectionEncoder(Type type) {
|
protected <E> Encodeable<ProtobufWriter, E> createCollectionEncoder(Type type) {
|
||||||
|
if (type instanceof ParameterizedType) {
|
||||||
|
ParameterizedType pt = (ParameterizedType) type;
|
||||||
|
Type componentType = pt.getActualTypeArguments()[0];
|
||||||
|
Creator<? extends Collection> creator = ProtobufCoders.LIST_CREATOR;
|
||||||
|
if (componentType == Boolean.class) {
|
||||||
|
return (Encodeable) new ProtobufBoolCollectionSimpledCoder(creator);
|
||||||
|
} else if (componentType == Byte.class) {
|
||||||
|
return (Encodeable) new ProtobufByteCollectionSimpledCoder(creator);
|
||||||
|
} else if (componentType == Character.class) {
|
||||||
|
return (Encodeable) new ProtobufCharCollectionSimpledCoder(creator);
|
||||||
|
} else if (componentType == Short.class) {
|
||||||
|
return (Encodeable) new ProtobufShortCollectionSimpledCoder(creator);
|
||||||
|
} else if (componentType == Integer.class) {
|
||||||
|
return (Encodeable) new ProtobufIntCollectionSimpledCoder(creator);
|
||||||
|
} else if (componentType == Float.class) {
|
||||||
|
return (Encodeable) new ProtobufFloatCollectionSimpledCoder(creator);
|
||||||
|
} else if (componentType == Long.class) {
|
||||||
|
return (Encodeable) new ProtobufLongCollectionSimpledCoder(creator);
|
||||||
|
} else if (componentType == Double.class) {
|
||||||
|
return (Encodeable) new ProtobufDoubleCollectionSimpledCoder(creator);
|
||||||
|
} else if (componentType == AtomicInteger.class) {
|
||||||
|
return (Encodeable) new ProtobufAtomicIntegerCollectionSimpledCoder(creator);
|
||||||
|
} else if (componentType == AtomicLong.class) {
|
||||||
|
return (Encodeable) new ProtobufAtomicLongCollectionSimpledCoder(creator);
|
||||||
|
}
|
||||||
|
}
|
||||||
return new ProtobufCollectionEncoder(this, type);
|
return new ProtobufCollectionEncoder(this, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -262,6 +288,31 @@ public class ProtobufFactory extends ConvertFactory<ProtobufReader, ProtobufWrit
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected <E> Encodeable<ProtobufWriter, E> createStreamEncoder(Type type) {
|
protected <E> Encodeable<ProtobufWriter, E> createStreamEncoder(Type type) {
|
||||||
|
if (type instanceof ParameterizedType) {
|
||||||
|
ParameterizedType pt = (ParameterizedType) type;
|
||||||
|
Type componentType = pt.getActualTypeArguments()[0];
|
||||||
|
if (componentType == Boolean.class) {
|
||||||
|
return (Encodeable) ProtobufBoolStreamSimpledCoder.instance;
|
||||||
|
} else if (componentType == Byte.class) {
|
||||||
|
return (Encodeable) ProtobufByteStreamSimpledCoder.instance;
|
||||||
|
} else if (componentType == Character.class) {
|
||||||
|
return (Encodeable) ProtobufCharStreamSimpledCoder.instance;
|
||||||
|
} else if (componentType == Short.class) {
|
||||||
|
return (Encodeable) ProtobufShortStreamSimpledCoder.instance;
|
||||||
|
} else if (componentType == Integer.class) {
|
||||||
|
return (Encodeable) ProtobufIntStreamSimpledCoder.instance;
|
||||||
|
} else if (componentType == Float.class) {
|
||||||
|
return (Encodeable) ProtobufFloatStreamSimpledCoder.instance;
|
||||||
|
} else if (componentType == Long.class) {
|
||||||
|
return (Encodeable) ProtobufLongStreamSimpledCoder.instance;
|
||||||
|
} else if (componentType == Double.class) {
|
||||||
|
return (Encodeable) ProtobufDoubleStreamSimpledCoder.instance;
|
||||||
|
} else if (componentType == AtomicInteger.class) {
|
||||||
|
return (Encodeable) ProtobufAtomicIntegerStreamSimpledCoder.instance;
|
||||||
|
} else if (componentType == AtomicLong.class) {
|
||||||
|
return (Encodeable) ProtobufAtomicLongStreamSimpledCoder.instance;
|
||||||
|
}
|
||||||
|
}
|
||||||
return new ProtobufStreamEncoder(this, type);
|
return new ProtobufStreamEncoder(this, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -366,7 +417,7 @@ public class ProtobufFactory extends ConvertFactory<ProtobufReader, ProtobufWrit
|
|||||||
|| componentType == AtomicLong.class
|
|| componentType == AtomicLong.class
|
||||||
|| componentType == String.class;
|
|| componentType == String.class;
|
||||||
}
|
}
|
||||||
|
|
||||||
// see io.protostuff.ProtobufOutput
|
// see io.protostuff.ProtobufOutput
|
||||||
protected static int computeRawVarint32Size(final int value) {
|
protected static int computeRawVarint32Size(final int value) {
|
||||||
if (value == 0) return 1;
|
if (value == 0) return 1;
|
||||||
@@ -390,7 +441,7 @@ public class ProtobufFactory extends ConvertFactory<ProtobufReader, ProtobufWrit
|
|||||||
if ((value & (0xffffffffffffffffL << 63)) == 0) return 9;
|
if ((value & (0xffffffffffffffffL << 63)) == 0) return 9;
|
||||||
return 10;
|
return 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
// see com.google.protobuf.CodedOutputStream
|
// see com.google.protobuf.CodedOutputStream
|
||||||
protected static int computeInt32SizeNoTag(final int value) {
|
protected static int computeInt32SizeNoTag(final int value) {
|
||||||
if (value == 0) {
|
if (value == 0) {
|
||||||
|
|||||||
@@ -52,9 +52,8 @@ public class ProtobufMapEncoder<K, V> extends MapEncoder<ProtobufWriter, K, V> {
|
|||||||
kencoder.convertTo(tmp, key);
|
kencoder.convertTo(tmp, key);
|
||||||
tmp.writeTag(valTag);
|
tmp.writeTag(valTag);
|
||||||
vencoder.convertTo(tmp, v);
|
vencoder.convertTo(tmp, v);
|
||||||
|
|
||||||
out.writeLength(tmp.count());
|
out.writeTuple(tmp);
|
||||||
out.writeTo(tmp.toArray());
|
|
||||||
out.offerChild(tmp);
|
out.offerChild(tmp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ public class ProtobufObjectEncoder<T> extends ObjectEncoder<ProtobufWriter, T> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected ProtobufWriter objectWriter(ProtobufWriter out, T value) {
|
protected ProtobufWriter objectWriter(ProtobufWriter out, T value) {
|
||||||
if (out.count() > out.initOffset) {
|
if (out.length() > out.initOffset) {
|
||||||
return out.pollChild().configParentFunc(out);
|
return out.pollChild().configParentFunc(out);
|
||||||
}
|
}
|
||||||
return out;
|
return out;
|
||||||
|
|||||||
@@ -284,7 +284,6 @@ public class ProtobufReader extends Reader {
|
|||||||
|
|
||||||
public final int[] readInts() {
|
public final int[] readInts() {
|
||||||
int len = readRawVarint32();
|
int len = readRawVarint32();
|
||||||
System.out.println("等到长度: " + len);
|
|
||||||
List<Integer> list = new ArrayList<>(len);
|
List<Integer> list = new ArrayList<>(len);
|
||||||
while (len > 0) {
|
while (len > 0) {
|
||||||
int val = readInt();
|
int val = readInt();
|
||||||
|
|||||||
@@ -40,8 +40,7 @@ public class ProtobufStreamEncoder<T> extends StreamEncoder<ProtobufWriter, T> {
|
|||||||
} else {
|
} else {
|
||||||
ProtobufWriter tmp = out.pollChild();
|
ProtobufWriter tmp = out.pollChild();
|
||||||
itemEncoder.convertTo(tmp, item);
|
itemEncoder.convertTo(tmp, item);
|
||||||
out.writeLength(tmp.count());
|
out.writeTuple(tmp);
|
||||||
out.writeTo(tmp.toArray());
|
|
||||||
out.offerChild(tmp);
|
out.offerChild(tmp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ class ProtobufStreamReader extends ProtobufByteBufferReader {
|
|||||||
if (backByte != null) {
|
if (backByte != null) {
|
||||||
byte b = backByte;
|
byte b = backByte;
|
||||||
backByte = null;
|
backByte = null;
|
||||||
|
this.position++;
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
@@ -67,6 +68,7 @@ class ProtobufStreamReader extends ProtobufByteBufferReader {
|
|||||||
try {
|
try {
|
||||||
int v;
|
int v;
|
||||||
while ((v = in.read()) != -1) {
|
while ((v = in.read()) != -1) {
|
||||||
|
this.position++;
|
||||||
array.putByte(v);
|
array.putByte(v);
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
@@ -77,6 +79,12 @@ class ProtobufStreamReader extends ProtobufByteBufferReader {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasNext() {
|
public boolean hasNext() {
|
||||||
|
if (backByte != null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (this.limit > 0 && (this.position + 1) >= this.limit) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
int v = in.read();
|
int v = in.read();
|
||||||
if (v == -1) {
|
if (v == -1) {
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
package org.redkale.convert.pb;
|
package org.redkale.convert.pb;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
import org.redkale.convert.ConvertException;
|
import org.redkale.convert.ConvertException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -36,6 +37,7 @@ class ProtobufStreamWriter extends ProtobufByteBufferWriter {
|
|||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new ConvertException(e);
|
throw new ConvertException(e);
|
||||||
}
|
}
|
||||||
|
this.count += len;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -45,5 +47,11 @@ class ProtobufStreamWriter extends ProtobufByteBufferWriter {
|
|||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new ConvertException(e);
|
throw new ConvertException(e);
|
||||||
}
|
}
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ByteBuffer[] toBuffers() {
|
||||||
|
throw new UnsupportedOperationException("Not supported yet."); // 无需实现
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -47,7 +47,7 @@ public class GenericEntityTest {
|
|||||||
System.out.println("-------------------- runJson1 ---------------------------------");
|
System.out.println("-------------------- runJson1 ---------------------------------");
|
||||||
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(ENTITY_TYPE, bean);
|
||||||
System.out.println(json);
|
System.out.println(json);
|
||||||
System.out.println(convert.convertFrom(ENTITY_TYPE, json).toString());
|
System.out.println(convert.convertFrom(ENTITY_TYPE, json).toString());
|
||||||
Assertions.assertEquals(JSON, json);
|
Assertions.assertEquals(JSON, json);
|
||||||
@@ -55,7 +55,6 @@ public class GenericEntityTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void runJson2() throws Exception {
|
public void runJson2() throws Exception {
|
||||||
System.out.println("-------------------- runJson2 ---------------------------------");
|
|
||||||
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);
|
||||||
@@ -67,7 +66,6 @@ public class GenericEntityTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void runJson3() throws Exception {
|
public void runJson3() throws Exception {
|
||||||
System.out.println("-------------------- runJson3 ---------------------------------");
|
|
||||||
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);
|
||||||
@@ -82,10 +80,9 @@ public class GenericEntityTest {
|
|||||||
System.out.println("-------------------- runPb1 ---------------------------------");
|
System.out.println("-------------------- runPb1 ---------------------------------");
|
||||||
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(ENTITY_TYPE, bean);
|
||||||
Utility.println("proto", bs);
|
Utility.println("proto0 ", bs);
|
||||||
String rs = convert.convertFrom(ENTITY_TYPE, bs).toString();
|
String rs = convert.convertFrom(ENTITY_TYPE, bs).toString();
|
||||||
System.out.println();
|
|
||||||
Assertions.assertEquals(JSON, rs);
|
Assertions.assertEquals(JSON, rs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -94,13 +91,16 @@ public class GenericEntityTest {
|
|||||||
System.out.println("-------------------- runPb2 ---------------------------------");
|
System.out.println("-------------------- runPb2 ---------------------------------");
|
||||||
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(ENTITY_TYPE, 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));
|
byte[] bs2 = ConvertHelper.toBytes(buffers);
|
||||||
|
Utility.println("proto1 ", bs);
|
||||||
|
Utility.println("proto2 ", bs2);
|
||||||
|
Assertions.assertArrayEquals(bs, bs2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -108,13 +108,16 @@ public class GenericEntityTest {
|
|||||||
System.out.println("-------------------- runPb3 ---------------------------------");
|
System.out.println("-------------------- runPb3 ---------------------------------");
|
||||||
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(ENTITY_TYPE, bean);
|
||||||
|
Utility.println("proto1 ", bs);
|
||||||
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());
|
byte[] bs2 = out.toByteArray();
|
||||||
|
Utility.println("proto2 ", bs2);
|
||||||
|
Assertions.assertArrayEquals(bs, bs2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -173,26 +176,26 @@ public class GenericEntityTest {
|
|||||||
|
|
||||||
public static class GenericEntity<T, K, V> {
|
public static class GenericEntity<T, K, V> {
|
||||||
|
|
||||||
@ConvertColumn(index = 3)
|
@ConvertColumn(index = 1)
|
||||||
private K oneName;
|
private Entry<K, V> oneEntry;
|
||||||
|
|
||||||
@ConvertColumn(index = 2)
|
@ConvertColumn(index = 2)
|
||||||
private List<? extends T> oneList;
|
private List<? extends T> oneList;
|
||||||
|
|
||||||
@ConvertColumn(index = 1)
|
@ConvertColumn(index = 3)
|
||||||
private Entry<K, V> oneEntry;
|
private K oneName;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return JsonConvert.root().convertTo(this);
|
return JsonConvert.root().convertTo(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public K getOneName() {
|
public Entry<K, V> getOneEntry() {
|
||||||
return oneName;
|
return oneEntry;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setOneName(K oneName) {
|
public void setOneEntry(Entry<K, V> oneEntry) {
|
||||||
this.oneName = oneName;
|
this.oneEntry = oneEntry;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<? extends T> getOneList() {
|
public List<? extends T> getOneList() {
|
||||||
@@ -203,12 +206,12 @@ public class GenericEntityTest {
|
|||||||
this.oneList = oneList;
|
this.oneList = oneList;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Entry<K, V> getOneEntry() {
|
public K getOneName() {
|
||||||
return oneEntry;
|
return oneName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setOneEntry(Entry<K, V> oneEntry) {
|
public void setOneName(K oneName) {
|
||||||
this.oneEntry = oneEntry;
|
this.oneName = oneName;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user