Convert优化

This commit is contained in:
redkale
2023-06-25 10:44:48 +08:00
parent 27f54ebd15
commit d44fb67f88
5 changed files with 63 additions and 179 deletions

View File

@@ -28,7 +28,9 @@ public abstract class BinaryConvert<R extends Reader, W extends Writer> extends
return true; return true;
} }
public abstract byte[] convertTo(final Object value); public final byte[] convertTo(final Object value) {
return convertTo((Type) null, value);
}
public abstract byte[] convertTo(final Type type, final Object value); public abstract byte[] convertTo(final Type type, final Object value);

View File

@@ -79,23 +79,33 @@ public abstract class Convert<R extends Reader, W extends Writer> {
public abstract <T> T convertFrom(final Type type, final ConvertMask mask, final ByteBuffer... buffers); public abstract <T> T convertFrom(final Type type, final ConvertMask mask, final ByteBuffer... buffers);
public abstract void convertTo(final W writer, final Object value); public final void convertTo(final W writer, final Object value) {
convertTo(writer, (Type) null, value);
}
public abstract void convertTo(final W writer, final Type type, final Object value); public abstract void convertTo(final W writer, final Type type, final Object value);
public abstract byte[] convertToBytes(final Object value); public final byte[] convertToBytes(final Object value) {
return convertToBytes((Type) null, value);
}
public abstract byte[] convertToBytes(final Type type, final Object value); public abstract byte[] convertToBytes(final Type type, final Object value);
public abstract void convertToBytes(final Object value, final ConvertBytesHandler handler); public final void convertToBytes(final Object value, final ConvertBytesHandler handler) {
convertToBytes((Type) null, value, handler);
}
public abstract void convertToBytes(final Type type, final Object value, final ConvertBytesHandler handler); public abstract void convertToBytes(final Type type, final Object value, final ConvertBytesHandler handler);
public abstract void convertToBytes(final ByteArray array, final Object value); public final void convertToBytes(final ByteArray array, final Object value) {
convertToBytes(array, (Type) null, value);
}
public abstract void convertToBytes(final ByteArray array, final Type type, final Object value); public abstract void convertToBytes(final ByteArray array, final Type type, final Object value);
public abstract ByteBuffer[] convertTo(final Supplier<ByteBuffer> supplier, final Object value); public final ByteBuffer[] convertTo(final Supplier<ByteBuffer> supplier, final Object value) {
return convertTo(supplier, (Type) null, value);
}
public abstract ByteBuffer[] convertTo(final Supplier<ByteBuffer> supplier, final Type type, final Object value); public abstract ByteBuffer[] convertTo(final Supplier<ByteBuffer> supplier, final Type type, final Object value);

View File

@@ -30,7 +30,9 @@ public abstract class TextConvert<R extends Reader, W extends Writer> extends Co
public abstract <T> T convertFrom(final Type type, final String text); public abstract <T> T convertFrom(final Type type, final String text);
public abstract String convertTo(final Object value); public final String convertTo(final Object value) {
return convertTo((Type) null, value);
}
public abstract String convertTo(final Type type, final Object value); public abstract String convertTo(final Type type, final Object value);

View File

@@ -202,7 +202,7 @@ public class BsonConvert extends BinaryConvert<BsonReader, BsonWriter> {
//------------------------------ convertTo ----------------------------------------------------------- //------------------------------ convertTo -----------------------------------------------------------
@Override @Override
public byte[] convertTo(final Object value) { public byte[] convertTo(final Type type, final Object value) {
if (value == null) { if (value == null) {
final BsonWriter out = pollWriter(); final BsonWriter out = pollWriter();
out.writeNull(); out.writeNull();
@@ -210,36 +210,18 @@ public class BsonConvert extends BinaryConvert<BsonReader, BsonWriter> {
offerWriter(out); offerWriter(out);
return result; return result;
} }
return convertTo(value.getClass(), value);
}
@Override
public byte[] convertTo(final Type type, final Object value) {
if (type == null) {
return null;
}
final BsonWriter writer = pollWriter(); final BsonWriter writer = pollWriter();
factory.loadEncoder(type).convertTo(writer, value); factory.loadEncoder(type == null ? value.getClass() : type).convertTo(writer, value);
byte[] result = writer.toArray(); byte[] result = writer.toArray();
offerWriter(writer); offerWriter(writer);
return result; return result;
} }
@Override
public byte[] convertToBytes(final Object value) {
return convertTo(value);
}
@Override @Override
public byte[] convertToBytes(final Type type, final Object value) { public byte[] convertToBytes(final Type type, final Object value) {
return convertTo(type, value); return convertTo(type, value);
} }
@Override
public void convertToBytes(final Object value, final ConvertBytesHandler handler) {
convertToBytes(value == null ? null : value.getClass(), value, handler);
}
@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();
@@ -251,99 +233,58 @@ public class BsonConvert extends BinaryConvert<BsonReader, BsonWriter> {
writer.completed(handler, writerConsumer); writer.completed(handler, writerConsumer);
} }
@Override
public void convertToBytes(final ByteArray array, final Object value) {
convertToBytes(array, value == null ? null : value.getClass(), value);
}
@Override @Override
public void convertToBytes(final ByteArray array, final Type type, final Object value) { public void convertToBytes(final ByteArray array, final Type type, final Object value) {
final BsonWriter writer = configWrite(new BsonWriter(array).tiny(tiny)); final BsonWriter writer = configWrite(new BsonWriter(array).tiny(tiny));
if (type == null) { if (value == null) {
writer.writeNull(); writer.writeNull();
} else { } else {
factory.loadEncoder(type).convertTo(writer, value); factory.loadEncoder(type == null ? value.getClass() : type).convertTo(writer, value);
} }
writer.directTo(array); writer.directTo(array);
} }
public void convertTo(final OutputStream out, final Object value) { public void convertTo(final OutputStream out, final Object value) {
if (value == null) { convertTo(out, (Type) null, value);
pollWriter(out).writeNull();
} else {
factory.loadEncoder(value.getClass()).convertTo(pollWriter(out), value);
}
} }
public void convertTo(final OutputStream out, final Type type, final Object value) { public void convertTo(final OutputStream out, final Type type, final Object value) {
if (type == null) {
return;
}
if (value == null) { if (value == null) {
pollWriter(out).writeNull(); pollWriter(out).writeNull();
} else { } else {
factory.loadEncoder(type).convertTo(pollWriter(out), value); factory.loadEncoder(type == null ? value.getClass() : type).convertTo(pollWriter(out), value);
} }
} }
@Override
public ByteBuffer[] convertTo(final Supplier<ByteBuffer> supplier, final Object value) {
if (supplier == null) {
return null;
}
BsonByteBufferWriter out = pollWriter(supplier);
if (value == null) {
out.writeNull();
} else {
factory.loadEncoder(value.getClass()).convertTo(out, value);
}
return out.toBuffers();
}
@Override @Override
public ByteBuffer[] convertTo(final Supplier<ByteBuffer> supplier, final Type type, final Object value) { public ByteBuffer[] convertTo(final Supplier<ByteBuffer> supplier, final Type type, final Object value) {
if (supplier == null || type == null) { if (supplier == null) {
return null; return null;
} }
BsonByteBufferWriter writer = pollWriter(supplier); BsonByteBufferWriter writer = pollWriter(supplier);
if (value == null) { if (value == null) {
writer.writeNull(); writer.writeNull();
} else { } else {
factory.loadEncoder(type).convertTo(writer, value); factory.loadEncoder(type == null ? value.getClass() : type).convertTo(writer, value);
} }
return writer.toBuffers(); return writer.toBuffers();
} }
@Override @Override
public void convertTo(final BsonWriter writer, final Object value) { public void convertTo(final BsonWriter writer, final Type type, final Object value) {
if (value == null) { if (value == null) {
writer.writeNull(); writer.writeNull();
} else { } else {
factory.loadEncoder(value.getClass()).convertTo(writer, value); factory.loadEncoder(type == null ? value.getClass() : type).convertTo(writer, value);
} }
} }
@Override
public void convertTo(final BsonWriter writer, final Type type, final Object value) {
if (type == null) {
return;
}
factory.loadEncoder(type).convertTo(writer, value);
}
public BsonWriter convertToWriter(final Object value) {
if (value == null) {
return null;
}
return convertToWriter(value.getClass(), value);
}
public BsonWriter convertToWriter(final Type type, final Object value) { public BsonWriter convertToWriter(final Type type, final Object value) {
if (type == null) { if (value == null) {
return null; return null;
} }
final BsonWriter writer = writerPool.get().tiny(tiny); final BsonWriter writer = writerPool.get().tiny(tiny);
factory.loadEncoder(type).convertTo(writer, value); factory.loadEncoder(type == null ? value.getClass() : type).convertTo(writer, value);
return writer; return writer;
} }
} }

View File

@@ -324,30 +324,20 @@ public class JsonConvert extends TextConvert<JsonReader, JsonWriter> {
} }
//------------------------------ convertTo ----------------------------------------------------------- //------------------------------ convertTo -----------------------------------------------------------
@Override
public String convertTo(final Object value) {
if (value == null) {
return "null";
}
return convertTo(value.getClass(), value);
}
@Override @Override
public String convertTo(final Type type, final Object value) { public String convertTo(final Type type, final Object value) {
if (type == null) {
return null;
}
if (value == null) { if (value == null) {
return "null"; return "null";
} }
JsonBytesWriter writer = pollJsonBytesWriter(); JsonBytesWriter writer = pollJsonBytesWriter();
final Type t = type == null ? value.getClass() : type;
Encodeable encoder = this.lastConvertEncodeable; Encodeable encoder = this.lastConvertEncodeable;
if (encoder == null || encoder.getType() != type) { if (encoder == null || encoder.getType() != t) {
encoder = factory.loadEncoder(type); encoder = factory.loadEncoder(t);
this.lastConvertEncodeable = encoder; this.lastConvertEncodeable = encoder;
} }
if (encoder.specifyable()) { if (encoder.specifyable()) {
writer.specificObjectType(type); writer.specificObjectType(t);
} }
encoder.convertTo(writer, value); encoder.convertTo(writer, value);
@@ -356,30 +346,20 @@ public class JsonConvert extends TextConvert<JsonReader, JsonWriter> {
return result; return result;
} }
@Override
public byte[] convertToBytes(final Object value) {
if (value == null) {
return null;
}
return convertToBytes(value.getClass(), value);
}
@Override @Override
public byte[] convertToBytes(final Type type, final Object value) { public byte[] convertToBytes(final Type type, final Object value) {
if (type == null) {
return null;
}
if (value == null) { if (value == null) {
return null; return null;
} }
JsonBytesWriter writer = pollJsonBytesWriter(); JsonBytesWriter writer = pollJsonBytesWriter();
final Type t = type == null ? value.getClass() : type;
Encodeable encoder = this.lastConvertEncodeable; Encodeable encoder = this.lastConvertEncodeable;
if (encoder == null || encoder.getType() != type) { if (encoder == null || encoder.getType() != t) {
encoder = factory.loadEncoder(type); encoder = factory.loadEncoder(t);
this.lastConvertEncodeable = encoder; this.lastConvertEncodeable = encoder;
} }
if (encoder.specifyable()) { if (encoder.specifyable()) {
writer.specificObjectType(type); writer.specificObjectType(t);
} }
encoder.convertTo(writer, value); encoder.convertTo(writer, value);
@@ -388,84 +368,66 @@ public class JsonConvert extends TextConvert<JsonReader, JsonWriter> {
return result; return result;
} }
@Override
public void convertToBytes(final Object value, final ConvertBytesHandler handler) {
convertToBytes(value == null ? null : value.getClass(), value, handler);
}
@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) {
JsonBytesWriter writer = pollJsonBytesWriter(); JsonBytesWriter writer = pollJsonBytesWriter();
if (type == null) { if (value == null) {
writer.writeNull(); writer.writeNull();
} else { } else {
final Type t = type == null ? value.getClass() : type;
Encodeable encoder = this.lastConvertEncodeable; Encodeable encoder = this.lastConvertEncodeable;
if (encoder == null || encoder.getType() != type) { if (encoder == null || encoder.getType() != t) {
encoder = factory.loadEncoder(type); encoder = factory.loadEncoder(t);
this.lastConvertEncodeable = encoder; this.lastConvertEncodeable = encoder;
} }
if (encoder.specifyable()) { if (encoder.specifyable()) {
writer.specificObjectType(type); writer.specificObjectType(t);
} }
encoder.convertTo(writer, value); encoder.convertTo(writer, value);
} }
writer.completed(handler, offerBytesConsumer); writer.completed(handler, offerBytesConsumer);
} }
@Override
public void convertToBytes(final ByteArray array, final Object value) {
convertToBytes(array, value == null ? null : value.getClass(), value);
}
@Override @Override
public void convertToBytes(final ByteArray array, final Type type, final Object value) { public void convertToBytes(final ByteArray array, final Type type, final Object value) {
JsonBytesWriter writer = configWrite(new JsonBytesWriter(tiny, array)); JsonBytesWriter writer = configWrite(new JsonBytesWriter(tiny, array));
if (type == null) { if (value == null) {
writer.writeNull(); writer.writeNull();
} else { } else {
final Type t = type == null ? value.getClass() : type;
Encodeable encoder = this.lastConvertEncodeable; Encodeable encoder = this.lastConvertEncodeable;
if (encoder == null || encoder.getType() != type) { if (encoder == null || encoder.getType() != t) {
encoder = factory.loadEncoder(type); encoder = factory.loadEncoder(t);
this.lastConvertEncodeable = encoder; this.lastConvertEncodeable = encoder;
} }
if (encoder.specifyable()) { if (encoder.specifyable()) {
writer.specificObjectType(type); writer.specificObjectType(t);
} }
encoder.convertTo(writer, value); encoder.convertTo(writer, value);
} }
writer.directTo(array); writer.directTo(array);
} }
public void convertTo(final OutputStream out, final Object value) {
if (value == null) {
configWrite(new JsonStreamWriter(tiny, out)).writeNull();
} else {
convertTo(out, value.getClass(), value);
}
}
public void convertTo(final OutputStream out, final Type type, final Object value) { public void convertTo(final OutputStream out, final Type type, final Object value) {
if (type == null) {
return;
}
if (value == null) { if (value == null) {
configWrite(new JsonStreamWriter(tiny, out)).writeNull(); configWrite(new JsonStreamWriter(tiny, out)).writeNull();
} else { } else {
final Type t = type == null ? value.getClass() : type;
JsonStreamWriter writer = configWrite(new JsonStreamWriter(tiny, out)); JsonStreamWriter writer = configWrite(new JsonStreamWriter(tiny, out));
Encodeable encoder = this.lastConvertEncodeable; Encodeable encoder = this.lastConvertEncodeable;
if (encoder == null || encoder.getType() != type) { if (encoder == null || encoder.getType() != t) {
encoder = factory.loadEncoder(type); encoder = factory.loadEncoder(t);
this.lastConvertEncodeable = encoder; this.lastConvertEncodeable = encoder;
} }
if (encoder.specifyable()) { if (encoder.specifyable()) {
writer.specificObjectType(type); writer.specificObjectType(t);
} }
encoder.convertTo(writer, value); encoder.convertTo(writer, value);
} }
} }
@Override @Override
public ByteBuffer[] convertTo(final Supplier<ByteBuffer> supplier, final Object value) { public ByteBuffer[] convertTo(final Supplier<ByteBuffer> supplier, final Type type, final Object value) {
if (supplier == null) { if (supplier == null) {
return null; return null;
} }
@@ -473,59 +435,26 @@ public class JsonConvert extends TextConvert<JsonReader, JsonWriter> {
if (value == null) { if (value == null) {
out.writeNull(); out.writeNull();
} else { } else {
factory.loadEncoder(value.getClass()).convertTo(out, value); final Type t = type == null ? value.getClass() : type;
out.specificObjectType(t);
factory.loadEncoder(t).convertTo(out, value);
} }
return out.toBuffers(); return out.toBuffers();
} }
@Override
public ByteBuffer[] convertTo(final Supplier<ByteBuffer> supplier, final Type type, final Object value) {
if (supplier == null || type == null) {
return null;
}
JsonByteBufferWriter out = configWrite(new JsonByteBufferWriter(tiny, supplier));
if (value == null) {
out.writeNull();
} else {
out.specificObjectType(type);
factory.loadEncoder(type).convertTo(out, value);
}
return out.toBuffers();
}
@Override
public void convertTo(final JsonWriter writer, final Object value) {
if (value == null) {
writer.writeNull();
} else {
Class type = value.getClass();
Encodeable encoder = this.lastConvertEncodeable;
if (encoder == null || encoder.getType() != type) {
encoder = factory.loadEncoder(type);
this.lastConvertEncodeable = encoder;
}
if (encoder.specifyable()) {
writer.specificObjectType(type);
}
encoder.convertTo(writer, value);
}
}
@Override @Override
public void convertTo(final JsonWriter writer, final Type type, final Object value) { public void convertTo(final JsonWriter writer, final Type type, final Object value) {
if (type == null) {
return;
}
if (value == null) { if (value == null) {
writer.writeNull(); writer.writeNull();
} else { } else {
final Type t = type == null ? value.getClass() : type;
Encodeable encoder = this.lastConvertEncodeable; Encodeable encoder = this.lastConvertEncodeable;
if (encoder == null || encoder.getType() != type) { if (encoder == null || encoder.getType() != t) {
encoder = factory.loadEncoder(type); encoder = factory.loadEncoder(t);
this.lastConvertEncodeable = encoder; this.lastConvertEncodeable = encoder;
} }
if (encoder.specifyable()) { if (encoder.specifyable()) {
writer.specificObjectType(type); writer.specificObjectType(t);
} }
encoder.convertTo(writer, value); encoder.convertTo(writer, value);
} }