diff --git a/src/org/redkale/convert/BinaryConvert.java b/src/org/redkale/convert/BinaryConvert.java index 5019545a2..a32295148 100644 --- a/src/org/redkale/convert/BinaryConvert.java +++ b/src/org/redkale/convert/BinaryConvert.java @@ -6,6 +6,8 @@ package org.redkale.convert; import java.lang.reflect.Type; +import java.util.function.BiFunction; +import org.redkale.util.Attribute; /** * 二进制序列化/反序列化操作类 @@ -33,4 +35,10 @@ public abstract class BinaryConvert extends public abstract byte[] convertTo(final Type type, final Object value); public abstract byte[] convertMapTo(final Object... values); + + public abstract byte[] convertTo(BiFunction fieldFunc, final Object value); + + public abstract byte[] convertTo(final Type type, BiFunction fieldFunc, final Object value); + + public abstract byte[] convertMapTo(BiFunction fieldFunc, final Object... values); } diff --git a/src/org/redkale/convert/Convert.java b/src/org/redkale/convert/Convert.java index 3c35a95d8..55199c529 100644 --- a/src/org/redkale/convert/Convert.java +++ b/src/org/redkale/convert/Convert.java @@ -7,7 +7,8 @@ package org.redkale.convert; import java.lang.reflect.Type; import java.nio.ByteBuffer; -import java.util.function.Supplier; +import java.util.function.*; +import org.redkale.util.Attribute; /** * 序列化/反序列化操作类 @@ -31,6 +32,11 @@ public abstract class Convert { return this.factory; } + protected S funcWrite(S writer, BiFunction fieldFunc) { + writer.fieldFunc = fieldFunc; + return writer; + } + public abstract boolean isBinary(); public abstract T convertFrom(final Type type, final byte[] bytes); @@ -45,4 +51,9 @@ public abstract class Convert { public abstract ByteBuffer[] convertMapTo(final Supplier supplier, final Object... values); + public abstract ByteBuffer[] convertTo(final Supplier supplier, BiFunction fieldFunc, final Object value); + + public abstract ByteBuffer[] convertTo(final Supplier supplier, final Type type, BiFunction fieldFunc, final Object value); + + public abstract ByteBuffer[] convertMapTo(final Supplier supplier, BiFunction fieldFunc, final Object... values); } diff --git a/src/org/redkale/convert/TextConvert.java b/src/org/redkale/convert/TextConvert.java index 7d9d0b086..0229c3158 100644 --- a/src/org/redkale/convert/TextConvert.java +++ b/src/org/redkale/convert/TextConvert.java @@ -6,6 +6,8 @@ package org.redkale.convert; import java.lang.reflect.Type; +import java.util.function.BiFunction; +import org.redkale.util.Attribute; /** * 文本序列化/反序列化操作类 @@ -33,4 +35,10 @@ public abstract class TextConvert extends Co public abstract String convertTo(final Type type, final Object value); public abstract String convertMapTo(final Object... values); + + public abstract String convertTo(BiFunction fieldFunc, final Object value); + + public abstract String convertTo(final Type type, BiFunction fieldFunc, final Object value); + + public abstract String convertMapTo(BiFunction fieldFunc, final Object... values); } diff --git a/src/org/redkale/convert/Writer.java b/src/org/redkale/convert/Writer.java index 0937b0fe8..947eb67ba 100644 --- a/src/org/redkale/convert/Writer.java +++ b/src/org/redkale/convert/Writer.java @@ -6,7 +6,8 @@ package org.redkale.convert; import java.lang.reflect.*; -import org.redkale.util.StringWrapper; +import java.util.function.BiFunction; +import org.redkale.util.*; /** * 序列化的数据输出流 @@ -24,6 +25,9 @@ public abstract class Writer { //convertTo时是否以指定Type的ObjectEncoder进行处理 protected Type specify; + //对某个字段值进行动态处理 + protected BiFunction fieldFunc; + /** * 设置specify * @@ -39,6 +43,11 @@ public abstract class Writer { } } + protected boolean recycle() { + this.fieldFunc = null; + return true; + } + /** * 返回specify * @@ -106,7 +115,12 @@ public abstract class Writer { */ @SuppressWarnings("unchecked") public void writeObjectField(final EnMember member, Object obj) { - Object value = member.attribute.get(obj); + Object value; + if (fieldFunc == null) { + value = member.attribute.get(obj); + } else { + value = fieldFunc.apply(member.attribute, obj); + } if (value == null) return; if (tiny()) { if (member.istring) { diff --git a/src/org/redkale/convert/bson/BsonByteBufferWriter.java b/src/org/redkale/convert/bson/BsonByteBufferWriter.java index 4bcb36c9d..e0905d884 100644 --- a/src/org/redkale/convert/bson/BsonByteBufferWriter.java +++ b/src/org/redkale/convert/bson/BsonByteBufferWriter.java @@ -131,6 +131,7 @@ public class BsonByteBufferWriter extends BsonWriter { @Override protected boolean recycle() { + super.recycle(); this.index = 0; this.specify = null; this.buffers = null; diff --git a/src/org/redkale/convert/bson/BsonConvert.java b/src/org/redkale/convert/bson/BsonConvert.java index 649dec0b9..2019d0717 100644 --- a/src/org/redkale/convert/bson/BsonConvert.java +++ b/src/org/redkale/convert/bson/BsonConvert.java @@ -94,6 +94,7 @@ public final class BsonConvert extends BinaryConvert { } //------------------------------ convertFrom ----------------------------------------------------------- + @Override public T convertFrom(final Type type, final byte[] bytes) { if (bytes == null) return null; return convertFrom(type, bytes, 0, bytes.length); @@ -141,8 +142,13 @@ public final class BsonConvert extends BinaryConvert { //------------------------------ convertTo ----------------------------------------------------------- @Override public byte[] convertTo(final Object value) { + return convertTo((BiFunction) null, value); + } + + @Override + public byte[] convertTo(BiFunction fieldFunc, final Object value) { if (value == null) { - final BsonWriter out = writerPool.get().tiny(tiny); + final BsonWriter out = funcWrite(writerPool.get().tiny(tiny), fieldFunc); out.writeNull(); byte[] result = out.toArray(); writerPool.accept(out); @@ -153,8 +159,13 @@ public final class BsonConvert extends BinaryConvert { @Override public byte[] convertTo(final Type type, final Object value) { + return convertTo(type, (BiFunction) null, value); + } + + @Override + public byte[] convertTo(final Type type, BiFunction fieldFunc, final Object value) { if (type == null) return null; - final BsonWriter out = writerPool.get().tiny(tiny); + final BsonWriter out = funcWrite(writerPool.get().tiny(tiny), fieldFunc); factory.loadEncoder(type).convertTo(out, value); byte[] result = out.toArray(); writerPool.accept(out); @@ -163,8 +174,13 @@ public final class BsonConvert extends BinaryConvert { @Override public byte[] convertMapTo(final Object... values) { + return convertTo((BiFunction) null, values); + } + + @Override + public byte[] convertMapTo(BiFunction fieldFunc, final Object... values) { if (values == null) return null; - final BsonWriter out = writerPool.get().tiny(tiny); + final BsonWriter out = funcWrite(writerPool.get().tiny(tiny), fieldFunc); ((AnyEncoder) factory.getAnyEncoder()).convertMapTo(out, values); byte[] result = out.toArray(); writerPool.accept(out); @@ -198,8 +214,13 @@ public final class BsonConvert extends BinaryConvert { @Override public ByteBuffer[] convertTo(final Supplier supplier, final Object value) { + return convertTo(supplier, (BiFunction) null, value); + } + + @Override + public ByteBuffer[] convertTo(final Supplier supplier, BiFunction fieldFunc, final Object value) { if (supplier == null) return null; - BsonByteBufferWriter out = new BsonByteBufferWriter(tiny, supplier); + BsonByteBufferWriter out = funcWrite(new BsonByteBufferWriter(tiny, supplier), fieldFunc); if (value == null) { out.writeNull(); } else { @@ -210,8 +231,13 @@ public final class BsonConvert extends BinaryConvert { @Override public ByteBuffer[] convertTo(final Supplier supplier, final Type type, final Object value) { + return convertTo(supplier, type, (BiFunction) null, value); + } + + @Override + public ByteBuffer[] convertTo(final Supplier supplier, final Type type, BiFunction fieldFunc, final Object value) { if (supplier == null || type == null) return null; - BsonByteBufferWriter out = new BsonByteBufferWriter(tiny, supplier); + BsonByteBufferWriter out = funcWrite(new BsonByteBufferWriter(tiny, supplier), fieldFunc); if (value == null) { out.writeNull(); } else { @@ -222,8 +248,13 @@ public final class BsonConvert extends BinaryConvert { @Override public ByteBuffer[] convertMapTo(final Supplier supplier, final Object... values) { + return convertMapTo(supplier, (BiFunction) null, values); + } + + @Override + public ByteBuffer[] convertMapTo(final Supplier supplier, BiFunction fieldFunc, final Object... values) { if (supplier == null) return null; - BsonByteBufferWriter out = new BsonByteBufferWriter(tiny, supplier); + BsonByteBufferWriter out = funcWrite(new BsonByteBufferWriter(tiny, supplier), fieldFunc); if (values == null) { out.writeNull(); } else { diff --git a/src/org/redkale/convert/bson/BsonWriter.java b/src/org/redkale/convert/bson/BsonWriter.java index e0df6faa3..1cbe502f1 100644 --- a/src/org/redkale/convert/bson/BsonWriter.java +++ b/src/org/redkale/convert/bson/BsonWriter.java @@ -97,7 +97,9 @@ public class BsonWriter extends Writer { count += len; } + @Override protected boolean recycle() { + super.recycle(); this.count = 0; this.specify = null; if (this.content.length > defaultSize) { diff --git a/src/org/redkale/convert/json/JsonByteBufferWriter.java b/src/org/redkale/convert/json/JsonByteBufferWriter.java index 51c8e89be..166956809 100644 --- a/src/org/redkale/convert/json/JsonByteBufferWriter.java +++ b/src/org/redkale/convert/json/JsonByteBufferWriter.java @@ -48,6 +48,7 @@ public class JsonByteBufferWriter extends JsonWriter { @Override protected boolean recycle() { + super.recycle(); this.index = 0; this.specify = null; this.charset = null; diff --git a/src/org/redkale/convert/json/JsonConvert.java b/src/org/redkale/convert/json/JsonConvert.java index 94821ce57..5049742d1 100644 --- a/src/org/redkale/convert/json/JsonConvert.java +++ b/src/org/redkale/convert/json/JsonConvert.java @@ -186,11 +186,22 @@ public final class JsonConvert extends TextConvert { return convertTo(value.getClass(), value); } + @Override + public String convertTo(BiFunction fieldFunc, final Object value) { + if (value == null) return "null"; + return convertTo(value.getClass(), fieldFunc, value); + } + @Override public String convertTo(final Type type, final Object value) { + return convertTo(type, (BiFunction) null, value); + } + + @Override + public String convertTo(final Type type, BiFunction fieldFunc, final Object value) { if (type == null) return null; if (value == null) return "null"; - final JsonWriter writer = writerPool.get().tiny(tiny); + final JsonWriter writer = funcWrite(writerPool.get().tiny(tiny), fieldFunc); writer.specify(type); factory.loadEncoder(type).convertTo(writer, value); String result = writer.toString(); @@ -201,7 +212,13 @@ public final class JsonConvert extends TextConvert { @Override public String convertMapTo(final Object... values) { if (values == null) return "null"; - final JsonWriter writer = writerPool.get().tiny(tiny); + return convertMapTo((BiFunction) null, values); + } + + @Override + public String convertMapTo(BiFunction fieldFunc, final Object... values) { + if (values == null) return "null"; + final JsonWriter writer = funcWrite(writerPool.get().tiny(tiny), fieldFunc); ((AnyEncoder) factory.getAnyEncoder()).convertMapTo(writer, values); String result = writer.toString(); writerPool.accept(writer); @@ -252,8 +269,13 @@ public final class JsonConvert extends TextConvert { @Override public ByteBuffer[] convertTo(final Supplier supplier, final Object value) { + return convertTo(supplier, (BiFunction) null, value); + } + + @Override + public ByteBuffer[] convertTo(final Supplier supplier, BiFunction fieldFunc, final Object value) { if (supplier == null) return null; - JsonByteBufferWriter out = new JsonByteBufferWriter(tiny, null, supplier); + JsonByteBufferWriter out = funcWrite(new JsonByteBufferWriter(tiny, null, supplier), fieldFunc); if (value == null) { out.writeNull(); } else { @@ -264,8 +286,13 @@ public final class JsonConvert extends TextConvert { @Override public ByteBuffer[] convertTo(final Supplier supplier, final Type type, final Object value) { + return convertTo(supplier, type, (BiFunction) null, value); + } + + @Override + public ByteBuffer[] convertTo(final Supplier supplier, final Type type, BiFunction fieldFunc, final Object value) { if (supplier == null || type == null) return null; - JsonByteBufferWriter out = new JsonByteBufferWriter(tiny, null, supplier); + JsonByteBufferWriter out = funcWrite(new JsonByteBufferWriter(tiny, null, supplier), fieldFunc); if (value == null) { out.writeNull(); } else { @@ -277,8 +304,13 @@ public final class JsonConvert extends TextConvert { @Override public ByteBuffer[] convertMapTo(final Supplier supplier, final Object... values) { + return convertMapTo(supplier, (BiFunction) null, values); + } + + @Override + public ByteBuffer[] convertMapTo(final Supplier supplier, BiFunction fieldFunc, final Object... values) { if (supplier == null) return null; - JsonByteBufferWriter out = new JsonByteBufferWriter(tiny, null, supplier); + JsonByteBufferWriter out = funcWrite(new JsonByteBufferWriter(tiny, null, supplier), fieldFunc); if (values == null) { out.writeNull(); } else { diff --git a/src/org/redkale/convert/json/JsonWriter.java b/src/org/redkale/convert/json/JsonWriter.java index ba20ca192..ebf20d66a 100644 --- a/src/org/redkale/convert/json/JsonWriter.java +++ b/src/org/redkale/convert/json/JsonWriter.java @@ -97,7 +97,9 @@ public class JsonWriter extends Writer { if (quote) content[count++] = '"'; } + @Override protected boolean recycle() { + super.recycle(); this.count = 0; this.specify = null; if (this.content.length > defaultSize) {