Convert增加BiFunction<Attribute, Object, Object> fieldFunc参数

This commit is contained in:
Redkale
2019-09-19 12:05:03 +08:00
parent 2947275d54
commit 9ddb662016
10 changed files with 124 additions and 14 deletions

View File

@@ -6,6 +6,8 @@
package org.redkale.convert; package org.redkale.convert;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.function.BiFunction;
import org.redkale.util.Attribute;
/** /**
* 二进制序列化/反序列化操作类 * 二进制序列化/反序列化操作类
@@ -33,4 +35,10 @@ public abstract class BinaryConvert<R extends Reader, W extends Writer> extends
public abstract byte[] convertTo(final Type type, final Object value); public abstract byte[] convertTo(final Type type, final Object value);
public abstract byte[] convertMapTo(final Object... values); public abstract byte[] convertMapTo(final Object... values);
public abstract byte[] convertTo(BiFunction<Attribute, Object, Object> fieldFunc, final Object value);
public abstract byte[] convertTo(final Type type, BiFunction<Attribute, Object, Object> fieldFunc, final Object value);
public abstract byte[] convertMapTo(BiFunction<Attribute, Object, Object> fieldFunc, final Object... values);
} }

View File

@@ -7,7 +7,8 @@ package org.redkale.convert;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.nio.ByteBuffer; 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<R extends Reader, W extends Writer> {
return this.factory; return this.factory;
} }
protected <S extends W> S funcWrite(S writer, BiFunction<Attribute, Object, Object> fieldFunc) {
writer.fieldFunc = fieldFunc;
return writer;
}
public abstract boolean isBinary(); public abstract boolean isBinary();
public abstract <T> T convertFrom(final Type type, final byte[] bytes); public abstract <T> T convertFrom(final Type type, final byte[] bytes);
@@ -45,4 +51,9 @@ public abstract class Convert<R extends Reader, W extends Writer> {
public abstract ByteBuffer[] convertMapTo(final Supplier<ByteBuffer> supplier, final Object... values); public abstract ByteBuffer[] convertMapTo(final Supplier<ByteBuffer> supplier, final Object... values);
public abstract ByteBuffer[] convertTo(final Supplier<ByteBuffer> supplier, BiFunction<Attribute, Object, Object> fieldFunc, final Object value);
public abstract ByteBuffer[] convertTo(final Supplier<ByteBuffer> supplier, final Type type, BiFunction<Attribute, Object, Object> fieldFunc, final Object value);
public abstract ByteBuffer[] convertMapTo(final Supplier<ByteBuffer> supplier, BiFunction<Attribute, Object, Object> fieldFunc, final Object... values);
} }

View File

@@ -6,6 +6,8 @@
package org.redkale.convert; package org.redkale.convert;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.function.BiFunction;
import org.redkale.util.Attribute;
/** /**
* 文本序列化/反序列化操作类 * 文本序列化/反序列化操作类
@@ -33,4 +35,10 @@ public abstract class TextConvert<R extends Reader, W extends Writer> extends Co
public abstract String convertTo(final Type type, final Object value); public abstract String convertTo(final Type type, final Object value);
public abstract String convertMapTo(final Object... values); public abstract String convertMapTo(final Object... values);
public abstract String convertTo(BiFunction<Attribute, Object, Object> fieldFunc, final Object value);
public abstract String convertTo(final Type type, BiFunction<Attribute, Object, Object> fieldFunc, final Object value);
public abstract String convertMapTo(BiFunction<Attribute, Object, Object> fieldFunc, final Object... values);
} }

View File

@@ -6,7 +6,8 @@
package org.redkale.convert; package org.redkale.convert;
import java.lang.reflect.*; 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进行处理 //convertTo时是否以指定Type的ObjectEncoder进行处理
protected Type specify; protected Type specify;
//对某个字段值进行动态处理
protected BiFunction<Attribute, Object, Object> fieldFunc;
/** /**
* 设置specify * 设置specify
* *
@@ -39,6 +43,11 @@ public abstract class Writer {
} }
} }
protected boolean recycle() {
this.fieldFunc = null;
return true;
}
/** /**
* 返回specify * 返回specify
* *
@@ -106,7 +115,12 @@ public abstract class Writer {
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public void writeObjectField(final EnMember member, Object obj) { 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 (value == null) return;
if (tiny()) { if (tiny()) {
if (member.istring) { if (member.istring) {

View File

@@ -131,6 +131,7 @@ public class BsonByteBufferWriter extends BsonWriter {
@Override @Override
protected boolean recycle() { protected boolean recycle() {
super.recycle();
this.index = 0; this.index = 0;
this.specify = null; this.specify = null;
this.buffers = null; this.buffers = null;

View File

@@ -94,6 +94,7 @@ public final class BsonConvert extends BinaryConvert<BsonReader, BsonWriter> {
} }
//------------------------------ convertFrom ----------------------------------------------------------- //------------------------------ convertFrom -----------------------------------------------------------
@Override
public <T> T convertFrom(final Type type, final byte[] bytes) { public <T> T convertFrom(final Type type, final byte[] bytes) {
if (bytes == null) return null; if (bytes == null) return null;
return convertFrom(type, bytes, 0, bytes.length); return convertFrom(type, bytes, 0, bytes.length);
@@ -141,8 +142,13 @@ public final class BsonConvert extends BinaryConvert<BsonReader, BsonWriter> {
//------------------------------ convertTo ----------------------------------------------------------- //------------------------------ convertTo -----------------------------------------------------------
@Override @Override
public byte[] convertTo(final Object value) { public byte[] convertTo(final Object value) {
return convertTo((BiFunction) null, value);
}
@Override
public byte[] convertTo(BiFunction<Attribute, Object, Object> fieldFunc, final Object value) {
if (value == null) { if (value == null) {
final BsonWriter out = writerPool.get().tiny(tiny); final BsonWriter out = funcWrite(writerPool.get().tiny(tiny), fieldFunc);
out.writeNull(); out.writeNull();
byte[] result = out.toArray(); byte[] result = out.toArray();
writerPool.accept(out); writerPool.accept(out);
@@ -153,8 +159,13 @@ public final class BsonConvert extends BinaryConvert<BsonReader, BsonWriter> {
@Override @Override
public byte[] convertTo(final Type type, final Object value) { public byte[] convertTo(final Type type, final Object value) {
return convertTo(type, (BiFunction) null, value);
}
@Override
public byte[] convertTo(final Type type, BiFunction<Attribute, Object, Object> fieldFunc, final Object value) {
if (type == null) return null; 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); factory.loadEncoder(type).convertTo(out, value);
byte[] result = out.toArray(); byte[] result = out.toArray();
writerPool.accept(out); writerPool.accept(out);
@@ -163,8 +174,13 @@ public final class BsonConvert extends BinaryConvert<BsonReader, BsonWriter> {
@Override @Override
public byte[] convertMapTo(final Object... values) { public byte[] convertMapTo(final Object... values) {
return convertTo((BiFunction) null, values);
}
@Override
public byte[] convertMapTo(BiFunction<Attribute, Object, Object> fieldFunc, final Object... values) {
if (values == null) return null; 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); ((AnyEncoder) factory.getAnyEncoder()).convertMapTo(out, values);
byte[] result = out.toArray(); byte[] result = out.toArray();
writerPool.accept(out); writerPool.accept(out);
@@ -198,8 +214,13 @@ public final class BsonConvert extends BinaryConvert<BsonReader, BsonWriter> {
@Override @Override
public ByteBuffer[] convertTo(final Supplier<ByteBuffer> supplier, final Object value) { public ByteBuffer[] convertTo(final Supplier<ByteBuffer> supplier, final Object value) {
return convertTo(supplier, (BiFunction) null, value);
}
@Override
public ByteBuffer[] convertTo(final Supplier<ByteBuffer> supplier, BiFunction<Attribute, Object, Object> fieldFunc, final Object value) {
if (supplier == null) return null; if (supplier == null) return null;
BsonByteBufferWriter out = new BsonByteBufferWriter(tiny, supplier); BsonByteBufferWriter out = funcWrite(new BsonByteBufferWriter(tiny, supplier), fieldFunc);
if (value == null) { if (value == null) {
out.writeNull(); out.writeNull();
} else { } else {
@@ -210,8 +231,13 @@ public final class BsonConvert extends BinaryConvert<BsonReader, BsonWriter> {
@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) {
return convertTo(supplier, type, (BiFunction) null, value);
}
@Override
public ByteBuffer[] convertTo(final Supplier<ByteBuffer> supplier, final Type type, BiFunction<Attribute, Object, Object> fieldFunc, final Object value) {
if (supplier == null || type == null) return null; if (supplier == null || type == null) return null;
BsonByteBufferWriter out = new BsonByteBufferWriter(tiny, supplier); BsonByteBufferWriter out = funcWrite(new BsonByteBufferWriter(tiny, supplier), fieldFunc);
if (value == null) { if (value == null) {
out.writeNull(); out.writeNull();
} else { } else {
@@ -222,8 +248,13 @@ public final class BsonConvert extends BinaryConvert<BsonReader, BsonWriter> {
@Override @Override
public ByteBuffer[] convertMapTo(final Supplier<ByteBuffer> supplier, final Object... values) { public ByteBuffer[] convertMapTo(final Supplier<ByteBuffer> supplier, final Object... values) {
return convertMapTo(supplier, (BiFunction) null, values);
}
@Override
public ByteBuffer[] convertMapTo(final Supplier<ByteBuffer> supplier, BiFunction<Attribute, Object, Object> fieldFunc, final Object... values) {
if (supplier == null) return null; if (supplier == null) return null;
BsonByteBufferWriter out = new BsonByteBufferWriter(tiny, supplier); BsonByteBufferWriter out = funcWrite(new BsonByteBufferWriter(tiny, supplier), fieldFunc);
if (values == null) { if (values == null) {
out.writeNull(); out.writeNull();
} else { } else {

View File

@@ -97,7 +97,9 @@ public class BsonWriter extends Writer {
count += len; count += len;
} }
@Override
protected boolean recycle() { protected boolean recycle() {
super.recycle();
this.count = 0; this.count = 0;
this.specify = null; this.specify = null;
if (this.content.length > defaultSize) { if (this.content.length > defaultSize) {

View File

@@ -48,6 +48,7 @@ public class JsonByteBufferWriter extends JsonWriter {
@Override @Override
protected boolean recycle() { protected boolean recycle() {
super.recycle();
this.index = 0; this.index = 0;
this.specify = null; this.specify = null;
this.charset = null; this.charset = null;

View File

@@ -186,11 +186,22 @@ public final class JsonConvert extends TextConvert<JsonReader, JsonWriter> {
return convertTo(value.getClass(), value); return convertTo(value.getClass(), value);
} }
@Override
public String convertTo(BiFunction<Attribute, Object, Object> fieldFunc, final Object value) {
if (value == null) return "null";
return convertTo(value.getClass(), fieldFunc, value);
}
@Override @Override
public String convertTo(final Type type, final Object value) { public String convertTo(final Type type, final Object value) {
return convertTo(type, (BiFunction) null, value);
}
@Override
public String convertTo(final Type type, BiFunction<Attribute, Object, Object> fieldFunc, final Object value) {
if (type == null) return null; if (type == null) return null;
if (value == 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); writer.specify(type);
factory.loadEncoder(type).convertTo(writer, value); factory.loadEncoder(type).convertTo(writer, value);
String result = writer.toString(); String result = writer.toString();
@@ -201,7 +212,13 @@ public final class JsonConvert extends TextConvert<JsonReader, JsonWriter> {
@Override @Override
public String convertMapTo(final Object... values) { public String convertMapTo(final Object... values) {
if (values == null) return "null"; if (values == null) return "null";
final JsonWriter writer = writerPool.get().tiny(tiny); return convertMapTo((BiFunction) null, values);
}
@Override
public String convertMapTo(BiFunction<Attribute, Object, Object> fieldFunc, final Object... values) {
if (values == null) return "null";
final JsonWriter writer = funcWrite(writerPool.get().tiny(tiny), fieldFunc);
((AnyEncoder) factory.getAnyEncoder()).convertMapTo(writer, values); ((AnyEncoder) factory.getAnyEncoder()).convertMapTo(writer, values);
String result = writer.toString(); String result = writer.toString();
writerPool.accept(writer); writerPool.accept(writer);
@@ -252,8 +269,13 @@ public final class JsonConvert extends TextConvert<JsonReader, JsonWriter> {
@Override @Override
public ByteBuffer[] convertTo(final Supplier<ByteBuffer> supplier, final Object value) { public ByteBuffer[] convertTo(final Supplier<ByteBuffer> supplier, final Object value) {
return convertTo(supplier, (BiFunction) null, value);
}
@Override
public ByteBuffer[] convertTo(final Supplier<ByteBuffer> supplier, BiFunction<Attribute, Object, Object> fieldFunc, final Object value) {
if (supplier == null) return null; if (supplier == null) return null;
JsonByteBufferWriter out = new JsonByteBufferWriter(tiny, null, supplier); JsonByteBufferWriter out = funcWrite(new JsonByteBufferWriter(tiny, null, supplier), fieldFunc);
if (value == null) { if (value == null) {
out.writeNull(); out.writeNull();
} else { } else {
@@ -264,8 +286,13 @@ public final class JsonConvert extends TextConvert<JsonReader, JsonWriter> {
@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) {
return convertTo(supplier, type, (BiFunction) null, value);
}
@Override
public ByteBuffer[] convertTo(final Supplier<ByteBuffer> supplier, final Type type, BiFunction<Attribute, Object, Object> fieldFunc, final Object value) {
if (supplier == null || type == null) return null; 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) { if (value == null) {
out.writeNull(); out.writeNull();
} else { } else {
@@ -277,8 +304,13 @@ public final class JsonConvert extends TextConvert<JsonReader, JsonWriter> {
@Override @Override
public ByteBuffer[] convertMapTo(final Supplier<ByteBuffer> supplier, final Object... values) { public ByteBuffer[] convertMapTo(final Supplier<ByteBuffer> supplier, final Object... values) {
return convertMapTo(supplier, (BiFunction) null, values);
}
@Override
public ByteBuffer[] convertMapTo(final Supplier<ByteBuffer> supplier, BiFunction<Attribute, Object, Object> fieldFunc, final Object... values) {
if (supplier == null) return null; if (supplier == null) return null;
JsonByteBufferWriter out = new JsonByteBufferWriter(tiny, null, supplier); JsonByteBufferWriter out = funcWrite(new JsonByteBufferWriter(tiny, null, supplier), fieldFunc);
if (values == null) { if (values == null) {
out.writeNull(); out.writeNull();
} else { } else {

View File

@@ -97,7 +97,9 @@ public class JsonWriter extends Writer {
if (quote) content[count++] = '"'; if (quote) content[count++] = '"';
} }
@Override
protected boolean recycle() { protected boolean recycle() {
super.recycle();
this.count = 0; this.count = 0;
this.specify = null; this.specify = null;
if (this.content.length > defaultSize) { if (this.content.length > defaultSize) {