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;
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[] 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.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;
}
protected <S extends W> S funcWrite(S writer, BiFunction<Attribute, Object, Object> fieldFunc) {
writer.fieldFunc = fieldFunc;
return writer;
}
public abstract boolean isBinary();
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[] 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;
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 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;
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<Attribute, Object, Object> 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) {

View File

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

View File

@@ -94,6 +94,7 @@ public final class BsonConvert extends BinaryConvert<BsonReader, BsonWriter> {
}
//------------------------------ convertFrom -----------------------------------------------------------
@Override
public <T> 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<BsonReader, BsonWriter> {
//------------------------------ convertTo -----------------------------------------------------------
@Override
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) {
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<BsonReader, BsonWriter> {
@Override
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;
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<BsonReader, BsonWriter> {
@Override
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;
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<BsonReader, BsonWriter> {
@Override
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;
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<BsonReader, BsonWriter> {
@Override
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;
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<BsonReader, BsonWriter> {
@Override
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;
BsonByteBufferWriter out = new BsonByteBufferWriter(tiny, supplier);
BsonByteBufferWriter out = funcWrite(new BsonByteBufferWriter(tiny, supplier), fieldFunc);
if (values == null) {
out.writeNull();
} else {

View File

@@ -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) {

View File

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

View File

@@ -186,11 +186,22 @@ public final class JsonConvert extends TextConvert<JsonReader, JsonWriter> {
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
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 (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<JsonReader, JsonWriter> {
@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<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);
String result = writer.toString();
writerPool.accept(writer);
@@ -252,8 +269,13 @@ public final class JsonConvert extends TextConvert<JsonReader, JsonWriter> {
@Override
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;
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<JsonReader, JsonWriter> {
@Override
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;
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<JsonReader, JsonWriter> {
@Override
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;
JsonByteBufferWriter out = new JsonByteBufferWriter(tiny, null, supplier);
JsonByteBufferWriter out = funcWrite(new JsonByteBufferWriter(tiny, null, supplier), fieldFunc);
if (values == null) {
out.writeNull();
} else {

View File

@@ -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) {