This commit is contained in:
@@ -21,14 +21,14 @@ import org.redkale.util.Attribute;
|
|||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public final class EnMember<W extends Writer, T, F> implements Comparable<EnMember<W, T, F>> {
|
public final class EnMember<W extends Writer, T, F> implements Comparable<EnMember<W, T, F>> {
|
||||||
|
|
||||||
private final Attribute<T, F> attribute;
|
final Attribute<T, F> attribute;
|
||||||
|
|
||||||
final Encodeable<W, F> encoder;
|
final Encodeable<W, F> encoder;
|
||||||
|
|
||||||
private final boolean istring;
|
final boolean istring;
|
||||||
|
|
||||||
//private final boolean isnumber;
|
//final boolean isnumber;
|
||||||
private final boolean isbool;
|
final boolean isbool;
|
||||||
|
|
||||||
public EnMember(Attribute<T, F> attribute, Encodeable<W, F> encoder) {
|
public EnMember(Attribute<T, F> attribute, Encodeable<W, F> encoder) {
|
||||||
this.attribute = attribute;
|
this.attribute = attribute;
|
||||||
@@ -52,21 +52,6 @@ public final class EnMember<W extends Writer, T, F> implements Comparable<EnMemb
|
|||||||
return attribute.field().equals(name);
|
return attribute.field().equals(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean write(final W out, final boolean comma, final T obj) {
|
|
||||||
F value = attribute.get(obj);
|
|
||||||
if (value == null) return comma;
|
|
||||||
if (out.tiny()) {
|
|
||||||
if (istring) {
|
|
||||||
if (((CharSequence) value).length() == 0) return comma;
|
|
||||||
} else if (isbool) {
|
|
||||||
if (!((Boolean) value)) return comma;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
out.writeField(comma, attribute);
|
|
||||||
encoder.convertTo(out, value);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final int compareTo(EnMember<W, T, F> o) {
|
public final int compareTo(EnMember<W, T, F> o) {
|
||||||
if (o == null) return 1;
|
if (o == null) return 1;
|
||||||
|
|||||||
@@ -10,12 +10,13 @@ import java.lang.reflect.*;
|
|||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
|
||||||
import org.redkale.util.*;
|
import org.redkale.util.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* <p> 详情见: http://www.redkale.org
|
* <p>
|
||||||
|
* 详情见: http://www.redkale.org
|
||||||
|
*
|
||||||
* @author zhangjx
|
* @author zhangjx
|
||||||
* @param <R> Reader输入的子类
|
* @param <R> Reader输入的子类
|
||||||
* @param <T> 反解析的数据类型
|
* @param <T> 反解析的数据类型
|
||||||
@@ -164,9 +165,9 @@ public final class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public final T convertFrom(final R in) {
|
public final T convertFrom(final R in) {
|
||||||
final String clazz = in.readClassName();
|
final String clazz = in.readObjectB(typeClass);
|
||||||
if (clazz != null && !clazz.isEmpty()) return (T) factory.loadDecoder(factory.getEntity(clazz)).convertFrom(in);
|
if (clazz == null) return null;
|
||||||
if (in.readObjectB() == Reader.SIGN_NULL) return null;
|
if (!clazz.isEmpty()) return (T) factory.loadDecoder(factory.getEntity(clazz)).convertFrom(in);
|
||||||
if (!this.inited) {
|
if (!this.inited) {
|
||||||
synchronized (lock) {
|
synchronized (lock) {
|
||||||
try {
|
try {
|
||||||
@@ -178,16 +179,14 @@ public final class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T
|
|||||||
}
|
}
|
||||||
if (this.creatorConstructorMembers == null) { //空构造函数
|
if (this.creatorConstructorMembers == null) { //空构造函数
|
||||||
final T result = this.creator.create();
|
final T result = this.creator.create();
|
||||||
final AtomicInteger index = new AtomicInteger();
|
|
||||||
while (in.hasNext()) {
|
while (in.hasNext()) {
|
||||||
DeMember member = in.readField(index, members);
|
DeMember member = in.readFieldName(members);
|
||||||
in.skipBlank();
|
in.skipBlank();
|
||||||
if (member == null) {
|
if (member == null) {
|
||||||
in.skipValue(); //跳过不存在的属性的值
|
in.skipValue(); //跳过不存在的属性的值
|
||||||
} else {
|
} else {
|
||||||
member.read(in, result);
|
member.read(in, result);
|
||||||
}
|
}
|
||||||
index.incrementAndGet();
|
|
||||||
}
|
}
|
||||||
in.readObjectE();
|
in.readObjectE();
|
||||||
return result;
|
return result;
|
||||||
@@ -195,10 +194,9 @@ public final class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T
|
|||||||
final DeMember<R, T, ?>[] fields = this.creatorConstructorMembers;
|
final DeMember<R, T, ?>[] fields = this.creatorConstructorMembers;
|
||||||
final Object[] constructorParams = new Object[fields.length];
|
final Object[] constructorParams = new Object[fields.length];
|
||||||
final Object[][] otherParams = new Object[this.members.length][2];
|
final Object[][] otherParams = new Object[this.members.length][2];
|
||||||
final AtomicInteger index = new AtomicInteger();
|
|
||||||
int oc = 0;
|
int oc = 0;
|
||||||
while (in.hasNext()) {
|
while (in.hasNext()) {
|
||||||
DeMember member = in.readField(index, members);
|
DeMember member = in.readFieldName(members);
|
||||||
in.skipBlank();
|
in.skipBlank();
|
||||||
if (member == null) {
|
if (member == null) {
|
||||||
in.skipValue(); //跳过不存在的属性的值
|
in.skipValue(); //跳过不存在的属性的值
|
||||||
@@ -214,7 +212,6 @@ public final class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T
|
|||||||
}
|
}
|
||||||
if (flag) otherParams[oc++] = new Object[]{member.attribute, val};
|
if (flag) otherParams[oc++] = new Object[]{member.attribute, val};
|
||||||
}
|
}
|
||||||
index.incrementAndGet();
|
|
||||||
}
|
}
|
||||||
in.readObjectE();
|
in.readObjectE();
|
||||||
final T result = this.creator.create(constructorParams);
|
final T result = this.creator.create(constructorParams);
|
||||||
|
|||||||
@@ -12,7 +12,9 @@ import org.redkale.util.*;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* <p> 详情见: http://www.redkale.org
|
* <p>
|
||||||
|
* 详情见: http://www.redkale.org
|
||||||
|
*
|
||||||
* @author zhangjx
|
* @author zhangjx
|
||||||
* @param <W> Writer输出的子类
|
* @param <W> Writer输出的子类
|
||||||
* @param <T> 序列化的数据类型
|
* @param <T> 序列化的数据类型
|
||||||
@@ -102,8 +104,7 @@ public final class ObjectEncoder<W extends Writer, T> implements Encodeable<W, T
|
|||||||
@Override
|
@Override
|
||||||
public final void convertTo(W out, T value) {
|
public final void convertTo(W out, T value) {
|
||||||
if (value == null) {
|
if (value == null) {
|
||||||
out.wirteClassName(null);
|
out.writeObjectNull(null);
|
||||||
out.writeNull();
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!this.inited) {
|
if (!this.inited) {
|
||||||
@@ -121,10 +122,9 @@ public final class ObjectEncoder<W extends Writer, T> implements Encodeable<W, T
|
|||||||
factory.loadEncoder(clz).convertTo(out, value);
|
factory.loadEncoder(clz).convertTo(out, value);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
out.writeObjectB(members.length, value);
|
out.writeObjectB(value);
|
||||||
boolean comma = false;
|
|
||||||
for (EnMember member : members) {
|
for (EnMember member : members) {
|
||||||
comma = member.write(out, comma, value);
|
out.writeObjectField(member, value);
|
||||||
}
|
}
|
||||||
out.writeObjectE(value);
|
out.writeObjectE(value);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,8 +5,6 @@
|
|||||||
*/
|
*/
|
||||||
package org.redkale.convert;
|
package org.redkale.convert;
|
||||||
|
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* <p>
|
* <p>
|
||||||
@@ -14,7 +12,10 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||||||
*
|
*
|
||||||
* @author zhangjx
|
* @author zhangjx
|
||||||
*/
|
*/
|
||||||
public interface Reader {
|
public abstract class Reader {
|
||||||
|
|
||||||
|
//当前对象字段名的游标
|
||||||
|
protected int fieldIndex;
|
||||||
|
|
||||||
public static final short SIGN_NULL = -1;
|
public static final short SIGN_NULL = -1;
|
||||||
|
|
||||||
@@ -25,141 +26,143 @@ public interface Reader {
|
|||||||
*
|
*
|
||||||
* @return 是否还存在下个元素或字段
|
* @return 是否还存在下个元素或字段
|
||||||
*/
|
*/
|
||||||
public boolean hasNext();
|
public abstract boolean hasNext();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 跳过值(不包含值前面的字段)
|
* 跳过值(不包含值前面的字段)
|
||||||
*/
|
*/
|
||||||
public void skipValue();
|
public abstract void skipValue();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* /跳过字段与值之间的多余内容, json就是跳过:符, map跳过:
|
* /跳过字段与值之间的多余内容, json就是跳过:符, map跳过:
|
||||||
*/
|
*/
|
||||||
public void skipBlank();
|
public abstract void skipBlank();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 读取对象的开头 返回字段数
|
* 读取对象的类名, 返回 null 表示对象为null, 返回空字符串表示当前class与返回的class一致,返回非空字符串表示class是当前class的子类。
|
||||||
*
|
*
|
||||||
* @return 返回字段数
|
* @return 返回字段数
|
||||||
*/
|
*/
|
||||||
public int readObjectB();
|
public String readObjectB(final Class clazz) {
|
||||||
|
this.fieldIndex = 0;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 读取对象的尾端
|
* 读取对象的尾端
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public void readObjectE();
|
public abstract void readObjectE();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 读取数组的开头并返回数组的长度
|
* 读取数组的开头并返回数组的长度
|
||||||
*
|
*
|
||||||
* @return 返回数组的长度
|
* @return 返回数组的长度
|
||||||
*/
|
*/
|
||||||
public int readArrayB();
|
public abstract int readArrayB();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 读取数组的尾端
|
* 读取数组的尾端
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public void readArrayE();
|
public abstract void readArrayE();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 读取map的开头并返回map的size
|
* 读取map的开头并返回map的size
|
||||||
*
|
*
|
||||||
* @return 返回map的size
|
* @return 返回map的size
|
||||||
*/
|
*/
|
||||||
public int readMapB();
|
public abstract int readMapB();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 读取数组的尾端
|
* 读取数组的尾端
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public void readMapE();
|
public abstract void readMapE();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据字段读取字段对应的DeMember
|
* 根据字段读取字段对应的DeMember
|
||||||
*
|
*
|
||||||
* @param index 当前members的游标位置
|
|
||||||
* @param members DeMember的全量集合
|
* @param members DeMember的全量集合
|
||||||
* @return 匹配的DeMember
|
* @return 匹配的DeMember
|
||||||
*/
|
*/
|
||||||
public DeMember readField(final AtomicInteger index, final DeMember[] members);
|
public abstract DeMember readFieldName(final DeMember[] members);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 读取一个boolean值
|
* 读取一个boolean值
|
||||||
*
|
*
|
||||||
* @return boolean值
|
* @return boolean值
|
||||||
*/
|
*/
|
||||||
public boolean readBoolean();
|
public abstract boolean readBoolean();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 读取一个byte值
|
* 读取一个byte值
|
||||||
*
|
*
|
||||||
* @return byte值
|
* @return byte值
|
||||||
*/
|
*/
|
||||||
public byte readByte();
|
public abstract byte readByte();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 读取一个char值
|
* 读取一个char值
|
||||||
*
|
*
|
||||||
* @return char值
|
* @return char值
|
||||||
*/
|
*/
|
||||||
public char readChar();
|
public abstract char readChar();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 读取一个short值
|
* 读取一个short值
|
||||||
*
|
*
|
||||||
* @return short值
|
* @return short值
|
||||||
*/
|
*/
|
||||||
public short readShort();
|
public abstract short readShort();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 读取一个int值
|
* 读取一个int值
|
||||||
*
|
*
|
||||||
* @return int值
|
* @return int值
|
||||||
*/
|
*/
|
||||||
public int readInt();
|
public abstract int readInt();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 读取一个long值
|
* 读取一个long值
|
||||||
*
|
*
|
||||||
* @return long值
|
* @return long值
|
||||||
*/
|
*/
|
||||||
public long readLong();
|
public abstract long readLong();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 读取一个float值
|
* 读取一个float值
|
||||||
*
|
*
|
||||||
* @return float值
|
* @return float值
|
||||||
*/
|
*/
|
||||||
public float readFloat();
|
public abstract float readFloat();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 读取一个double值
|
* 读取一个double值
|
||||||
*
|
*
|
||||||
* @return double值
|
* @return double值
|
||||||
*/
|
*/
|
||||||
public double readDouble();
|
public abstract double readDouble();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 读取无转义字符长度不超过255的字符串, 例如枚举值、字段名、类名字符串等
|
* 读取无转义字符长度不超过255的字符串, 例如枚举值、字段名、类名字符串等
|
||||||
*
|
*
|
||||||
* @return String值
|
* @return String值
|
||||||
*/
|
*/
|
||||||
public String readSmallString();
|
public abstract String readSmallString();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 读取反解析对象的类名
|
* 读取反解析对象的类名
|
||||||
*
|
*
|
||||||
* @return 类名
|
* @return 类名
|
||||||
*/
|
*/
|
||||||
public String readClassName();
|
public abstract String readClassName();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 读取一个String值
|
* 读取一个String值
|
||||||
*
|
*
|
||||||
* @return String值
|
* @return String值
|
||||||
*/
|
*/
|
||||||
public String readString();
|
public abstract String readString();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,156 +14,191 @@ import org.redkale.util.Attribute;
|
|||||||
*
|
*
|
||||||
* @author zhangjx
|
* @author zhangjx
|
||||||
*/
|
*/
|
||||||
public interface Writer {
|
public abstract class Writer {
|
||||||
|
|
||||||
|
//当前对象输出字段名之前是否需要分隔符, JSON字段间的分隔符为,逗号
|
||||||
|
protected boolean comma;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 当tiny=true时, 字符串为空、boolean为false的字段值都会被跳过, 不会输出。
|
* 当tiny=true时, 字符串为空、boolean为false的字段值都会被跳过, 不会输出。
|
||||||
*
|
*
|
||||||
* @return 是否简化
|
* @return 是否简化
|
||||||
*/
|
*/
|
||||||
public boolean tiny();
|
public abstract boolean tiny();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 输出null值
|
* 输出null值
|
||||||
*/
|
*/
|
||||||
public void writeNull();
|
public abstract void writeNull();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 写入类名
|
* 写入类名
|
||||||
*
|
*
|
||||||
* @param clazz 类名
|
* @param clazz 类名
|
||||||
*/
|
*/
|
||||||
public void wirteClassName(String clazz);
|
public abstract void wirteClassName(String clazz);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 输出一个对象前的操作
|
* 输出一个对象前的操作
|
||||||
*
|
* 注: 覆盖此方法必须要先调用父方法 super.writeObjectB(obj);
|
||||||
* @param fieldCount 字段个数
|
|
||||||
*
|
*
|
||||||
* @param obj 写入的对象
|
* @param obj 写入的对象
|
||||||
*/
|
*/
|
||||||
public void writeObjectB(int fieldCount, Object obj);
|
public void writeObjectB(Object obj) {
|
||||||
|
this.comma = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 输出一个为null的对象
|
||||||
|
*
|
||||||
|
* @param clazz 对象的类名
|
||||||
|
*/
|
||||||
|
public final void writeObjectNull(final Class clazz) {
|
||||||
|
wirteClassName(null);
|
||||||
|
writeNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 输出一个对象的某个字段
|
||||||
|
*
|
||||||
|
* @param member 字段
|
||||||
|
*
|
||||||
|
* @param obj 写入的对象
|
||||||
|
*/
|
||||||
|
public final void writeObjectField(final EnMember member, Object obj) {
|
||||||
|
Object value = member.attribute.get(obj);
|
||||||
|
if (value == null) return;
|
||||||
|
if (tiny()) {
|
||||||
|
if (member.istring) {
|
||||||
|
if (((CharSequence) value).length() == 0) return;
|
||||||
|
} else if (member.isbool) {
|
||||||
|
if (!((Boolean) value)) return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.writeFieldName(member.attribute);
|
||||||
|
member.encoder.convertTo(this, value);
|
||||||
|
this.comma = true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 输出一个对象后的操作
|
* 输出一个对象后的操作
|
||||||
*
|
*
|
||||||
* @param obj 写入的对象
|
* @param obj 写入的对象
|
||||||
*/
|
*/
|
||||||
public void writeObjectE(Object obj);
|
public abstract void writeObjectE(Object obj);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 输出一个数组前的操作
|
* 输出一个数组前的操作
|
||||||
*
|
*
|
||||||
* @param size 数组长度
|
* @param size 数组长度
|
||||||
*/
|
*/
|
||||||
public void writeArrayB(int size);
|
public abstract void writeArrayB(int size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 输出数组元素间的间隔符
|
* 输出数组元素间的间隔符
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public void writeArrayMark();
|
public abstract void writeArrayMark();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 输出一个数组后的操作
|
* 输出一个数组后的操作
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public void writeArrayE();
|
public abstract void writeArrayE();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 输出一个Map前的操作
|
* 输出一个Map前的操作
|
||||||
*
|
*
|
||||||
* @param size map大小
|
* @param size map大小
|
||||||
*/
|
*/
|
||||||
public void writeMapB(int size);
|
public abstract void writeMapB(int size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 输出一个Map中key与value间的间隔符
|
* 输出一个Map中key与value间的间隔符
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public void writeMapMark();
|
public abstract void writeMapMark();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 输出一个Map后的操作
|
* 输出一个Map后的操作
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public void writeMapE();
|
public abstract void writeMapE();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 输出一个字段
|
* 输出一个字段名
|
||||||
*
|
*
|
||||||
* @param comma 是否非第一个字段
|
|
||||||
* @param attribute 字段的Attribute对象
|
* @param attribute 字段的Attribute对象
|
||||||
*/
|
*/
|
||||||
public void writeField(boolean comma, Attribute attribute);
|
public abstract void writeFieldName(Attribute attribute);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 写入一个boolean值
|
* 写入一个boolean值
|
||||||
*
|
*
|
||||||
* @param value boolean值
|
* @param value boolean值
|
||||||
*/
|
*/
|
||||||
public void writeBoolean(boolean value);
|
public abstract void writeBoolean(boolean value);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 写入一个byte值
|
* 写入一个byte值
|
||||||
*
|
*
|
||||||
* @param value byte值
|
* @param value byte值
|
||||||
*/
|
*/
|
||||||
public void writeByte(byte value);
|
public abstract void writeByte(byte value);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 写入一个char值
|
* 写入一个char值
|
||||||
*
|
*
|
||||||
* @param value char值
|
* @param value char值
|
||||||
*/
|
*/
|
||||||
public void writeChar(char value);
|
public abstract void writeChar(char value);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 写入一个short值
|
* 写入一个short值
|
||||||
*
|
*
|
||||||
* @param value short值
|
* @param value short值
|
||||||
*/
|
*/
|
||||||
public void writeShort(short value);
|
public abstract void writeShort(short value);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 写入一个int值
|
* 写入一个int值
|
||||||
*
|
*
|
||||||
* @param value int值
|
* @param value int值
|
||||||
*/
|
*/
|
||||||
public void writeInt(int value);
|
public abstract void writeInt(int value);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 写入一个long值
|
* 写入一个long值
|
||||||
*
|
*
|
||||||
* @param value long值
|
* @param value long值
|
||||||
*/
|
*/
|
||||||
public void writeLong(long value);
|
public abstract void writeLong(long value);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 写入一个float值
|
* 写入一个float值
|
||||||
*
|
*
|
||||||
* @param value float值
|
* @param value float值
|
||||||
*/
|
*/
|
||||||
public void writeFloat(float value);
|
public abstract void writeFloat(float value);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 写入一个double值
|
* 写入一个double值
|
||||||
*
|
*
|
||||||
* @param value double值
|
* @param value double值
|
||||||
*/
|
*/
|
||||||
public void writeDouble(double value);
|
public abstract void writeDouble(double value);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 写入无转义字符长度不超过255的字符串, 例如枚举值、字段名、类名字符串等 *
|
* 写入无转义字符长度不超过255的字符串, 例如枚举值、字段名、类名字符串等 *
|
||||||
*
|
*
|
||||||
* @param value 非空且不含需要转义的字符的String值
|
* @param value 非空且不含需要转义的字符的String值
|
||||||
*/
|
*/
|
||||||
public void writeSmallString(String value);
|
public abstract void writeSmallString(String value);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 写入一个String值
|
* 写入一个String值
|
||||||
*
|
*
|
||||||
* @param value String值
|
* @param value String值
|
||||||
*/
|
*/
|
||||||
public void writeString(String value);
|
public abstract void writeString(String value);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
*/
|
*/
|
||||||
package org.redkale.convert.bson;
|
package org.redkale.convert.bson;
|
||||||
|
|
||||||
import java.util.concurrent.atomic.*;
|
|
||||||
import java.util.function.*;
|
import java.util.function.*;
|
||||||
import org.redkale.convert.*;
|
import org.redkale.convert.*;
|
||||||
import static org.redkale.convert.Reader.SIGN_NULL;
|
import static org.redkale.convert.Reader.SIGN_NULL;
|
||||||
@@ -19,7 +18,7 @@ import org.redkale.util.*;
|
|||||||
*
|
*
|
||||||
* @author zhangjx
|
* @author zhangjx
|
||||||
*/
|
*/
|
||||||
public class BsonReader implements Reader {
|
public class BsonReader extends Reader {
|
||||||
|
|
||||||
public static final short SIGN_OBJECTB = (short) 0xBB;
|
public static final short SIGN_OBJECTB = (short) 0xBB;
|
||||||
|
|
||||||
@@ -156,19 +155,18 @@ public class BsonReader implements Reader {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 判断下一个非空白字节是否为{
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
public final int readObjectB() {
|
public final String readObjectB(final Class clazz) {
|
||||||
|
this.fieldIndex = 0; //必须要重置为0
|
||||||
|
final String newcls = readClassName();
|
||||||
|
if (newcls != null && !newcls.isEmpty()) return newcls;
|
||||||
short bt = readShort();
|
short bt = readShort();
|
||||||
if (bt == Reader.SIGN_NULL) return bt;
|
if (bt == Reader.SIGN_NULL) return null;
|
||||||
if (bt != SIGN_OBJECTB) {
|
if (bt != SIGN_OBJECTB) {
|
||||||
throw new ConvertException("a bson object must begin with " + (SIGN_OBJECTB)
|
throw new ConvertException("a bson object must begin with " + (SIGN_OBJECTB)
|
||||||
+ " (position = " + position + ") but '" + currentByte() + "'");
|
+ " (position = " + position + ") but '" + currentByte() + "'");
|
||||||
}
|
}
|
||||||
return bt;
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -230,24 +228,20 @@ public class BsonReader implements Reader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final DeMember readField(final AtomicInteger index, final DeMember[] members) {
|
public final DeMember readFieldName(final DeMember[] members) {
|
||||||
final String exceptedfield = readSmallString();
|
final String exceptedfield = readSmallString();
|
||||||
this.typeval = readByte();
|
this.typeval = readByte();
|
||||||
final int len = members.length;
|
final int len = members.length;
|
||||||
int v = index.get();
|
if (this.fieldIndex >= len) this.fieldIndex = 0;
|
||||||
if (v >= len) {
|
for (int k = this.fieldIndex; k < len; k++) {
|
||||||
v = 0;
|
|
||||||
index.set(0);
|
|
||||||
}
|
|
||||||
for (int k = v; k < len; k++) {
|
|
||||||
if (exceptedfield.equals(members[k].getAttribute().field())) {
|
if (exceptedfield.equals(members[k].getAttribute().field())) {
|
||||||
index.set(k);
|
this.fieldIndex = k;
|
||||||
return members[k];
|
return members[k];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (int k = 0; k < v; k++) {
|
for (int k = 0; k < this.fieldIndex; k++) {
|
||||||
if (exceptedfield.equals(members[k].getAttribute().field())) {
|
if (exceptedfield.equals(members[k].getAttribute().field())) {
|
||||||
index.set(k);
|
this.fieldIndex = k;
|
||||||
return members[k];
|
return members[k];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,10 +12,12 @@ import org.redkale.util.*;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* <p> 详情见: http://www.redkale.org
|
* <p>
|
||||||
|
* 详情见: http://www.redkale.org
|
||||||
|
*
|
||||||
* @author zhangjx
|
* @author zhangjx
|
||||||
*/
|
*/
|
||||||
public class BsonWriter implements Writer {
|
public class BsonWriter extends Writer {
|
||||||
|
|
||||||
private static final int defaultSize = Integer.getInteger("convert.bson.writer.buffer.defsize", 1024);
|
private static final int defaultSize = Integer.getInteger("convert.bson.writer.buffer.defsize", 1024);
|
||||||
|
|
||||||
@@ -171,7 +173,8 @@ public class BsonWriter implements Writer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final void writeObjectB(int fieldCount, Object obj) {
|
public final void writeObjectB(Object obj) {
|
||||||
|
super.writeObjectB(obj);
|
||||||
writeSmallString("");
|
writeSmallString("");
|
||||||
writeShort(BsonReader.SIGN_OBJECTB);
|
writeShort(BsonReader.SIGN_OBJECTB);
|
||||||
}
|
}
|
||||||
@@ -183,7 +186,7 @@ public class BsonWriter implements Writer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final void writeField(boolean comma, Attribute attribute) {
|
public final void writeFieldName( Attribute attribute) {
|
||||||
writeByte(BsonReader.SIGN_HASNEXT);
|
writeByte(BsonReader.SIGN_HASNEXT);
|
||||||
writeSmallString(attribute.field());
|
writeSmallString(attribute.field());
|
||||||
byte typeval = 127; //字段的类型值
|
byte typeval = 127; //字段的类型值
|
||||||
|
|||||||
@@ -11,7 +11,9 @@ import org.redkale.convert.*;
|
|||||||
/**
|
/**
|
||||||
* java.nio.channels.CompletionHandler 的SimpledCoder实现, 只输出null
|
* java.nio.channels.CompletionHandler 的SimpledCoder实现, 只输出null
|
||||||
*
|
*
|
||||||
* <p> 详情见: http://www.redkale.org
|
* <p>
|
||||||
|
* 详情见: http://www.redkale.org
|
||||||
|
*
|
||||||
* @author zhangjx
|
* @author zhangjx
|
||||||
* @param <R> Reader输入的子类型
|
* @param <R> Reader输入的子类型
|
||||||
* @param <W> Writer输出的子类型
|
* @param <W> Writer输出的子类型
|
||||||
@@ -22,12 +24,12 @@ public final class CompletionHandlerSimpledCoder<R extends Reader, W extends Wri
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void convertTo(W out, CompletionHandler value) {
|
public void convertTo(W out, CompletionHandler value) {
|
||||||
out.writeNull();
|
out.writeObjectNull(CompletionHandler.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompletionHandler convertFrom(R in) {
|
public CompletionHandler convertFrom(R in) {
|
||||||
in.readObjectB();
|
in.readObjectB(CompletionHandler.class);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -113,11 +113,11 @@ public class JsonByteBufferReader extends JsonReader {
|
|||||||
* @return SIGN_NOLENGTH 或 SIGN_NULL
|
* @return SIGN_NOLENGTH 或 SIGN_NULL
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public final int readObjectB() {
|
public final String readObjectB(final Class clazz) {
|
||||||
char ch = nextGoodChar();
|
char ch = nextGoodChar();
|
||||||
if (ch == '{') return SIGN_NOLENGTH;
|
if (ch == '{') return "";
|
||||||
if (ch == 'n' && nextChar() == 'u' && nextChar() == 'l' && nextChar() == 'l') return SIGN_NULL;
|
if (ch == 'n' && nextChar() == 'u' && nextChar() == 'l' && nextChar() == 'l') return null;
|
||||||
if (ch == 'N' && nextChar() == 'U' && nextChar() == 'L' && nextChar() == 'L') return SIGN_NULL;
|
if (ch == 'N' && nextChar() == 'U' && nextChar() == 'L' && nextChar() == 'L') return null;
|
||||||
throw new ConvertException("a json object text must begin with '{' (position = " + position + ") but '" + ch + "'");
|
throw new ConvertException("a json object text must begin with '{' (position = " + position + ") but '" + ch + "'");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
*/
|
*/
|
||||||
package org.redkale.convert.json;
|
package org.redkale.convert.json;
|
||||||
|
|
||||||
import java.util.concurrent.atomic.*;
|
|
||||||
import java.util.function.*;
|
import java.util.function.*;
|
||||||
import org.redkale.convert.*;
|
import org.redkale.convert.*;
|
||||||
import static org.redkale.convert.Reader.*;
|
import static org.redkale.convert.Reader.*;
|
||||||
@@ -18,7 +17,7 @@ import org.redkale.util.*;
|
|||||||
*
|
*
|
||||||
* @author zhangjx
|
* @author zhangjx
|
||||||
*/
|
*/
|
||||||
public class JsonReader implements Reader {
|
public class JsonReader extends Reader {
|
||||||
|
|
||||||
protected int position = -1;
|
protected int position = -1;
|
||||||
|
|
||||||
@@ -169,21 +168,23 @@ public class JsonReader implements Reader {
|
|||||||
/**
|
/**
|
||||||
* 判断下一个非空白字符是否为{
|
* 判断下一个非空白字符是否为{
|
||||||
*
|
*
|
||||||
* @return SIGN_NOLENGTH 或 SIGN_NULL
|
* @param clazz 类名
|
||||||
|
* @return 返回 null 表示对象为null, 返回空字符串表示当前class与返回的class一致,返回非空字符串表示class是当前class的子类。
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public int readObjectB() {
|
public String readObjectB(final Class clazz) {
|
||||||
|
this.fieldIndex = 0; //必须要重置为0
|
||||||
char ch = this.text[++this.position];
|
char ch = this.text[++this.position];
|
||||||
if (ch == '{') return SIGN_NOLENGTH;
|
if (ch == '{') return "";
|
||||||
if (ch <= ' ') {
|
if (ch <= ' ') {
|
||||||
for (;;) {
|
for (;;) {
|
||||||
ch = this.text[++this.position];
|
ch = this.text[++this.position];
|
||||||
if (ch > ' ') break;
|
if (ch > ' ') break;
|
||||||
}
|
}
|
||||||
if (ch == '{') return SIGN_NOLENGTH;
|
if (ch == '{') return "";
|
||||||
}
|
}
|
||||||
if (ch == 'n' && text[++position] == 'u' && text[++position] == 'l' && text[++position] == 'l') return SIGN_NULL;
|
if (ch == 'n' && text[++position] == 'u' && text[++position] == 'l' && text[++position] == 'l') return null;
|
||||||
if (ch == 'N' && text[++position] == 'U' && text[++position] == 'L' && text[++position] == 'L') return SIGN_NULL;
|
if (ch == 'N' && text[++position] == 'U' && text[++position] == 'L' && text[++position] == 'L') return null;
|
||||||
throw new ConvertException("a json object text must begin with '{' (position = " + position + ") but '" + ch + "' in (" + new String(this.text) + ")");
|
throw new ConvertException("a json object text must begin with '{' (position = " + position + ") but '" + ch + "' in (" + new String(this.text) + ")");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -416,23 +417,19 @@ public class JsonReader implements Reader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final DeMember readField(final AtomicInteger index, final DeMember[] members) {
|
public final DeMember readFieldName(final DeMember[] members) {
|
||||||
final String exceptedfield = this.readSmallString();
|
final String exceptedfield = this.readSmallString();
|
||||||
final int len = members.length;
|
final int len = members.length;
|
||||||
int v = index.get();
|
if (this.fieldIndex >= len) this.fieldIndex = 0;
|
||||||
if (v >= len) {
|
for (int k = this.fieldIndex; k < len; k++) {
|
||||||
v = 0;
|
|
||||||
index.set(0);
|
|
||||||
}
|
|
||||||
for (int k = v; k < len; k++) {
|
|
||||||
if (exceptedfield.equals(members[k].getAttribute().field())) {
|
if (exceptedfield.equals(members[k].getAttribute().field())) {
|
||||||
index.set(k);
|
this.fieldIndex = k;
|
||||||
return members[k];
|
return members[k];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (int k = 0; k < v; k++) {
|
for (int k = 0; k < this.fieldIndex; k++) {
|
||||||
if (exceptedfield.equals(members[k].getAttribute().field())) {
|
if (exceptedfield.equals(members[k].getAttribute().field())) {
|
||||||
index.set(k);
|
this.fieldIndex = k;
|
||||||
return members[k];
|
return members[k];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import org.redkale.util.*;
|
|||||||
*
|
*
|
||||||
* @author zhangjx
|
* @author zhangjx
|
||||||
*/
|
*/
|
||||||
public class JsonWriter implements Writer {
|
public class JsonWriter extends Writer {
|
||||||
|
|
||||||
private static final char[] CHARS_TUREVALUE = "true".toCharArray();
|
private static final char[] CHARS_TUREVALUE = "true".toCharArray();
|
||||||
|
|
||||||
@@ -159,8 +159,8 @@ public class JsonWriter implements Writer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final void writeField(boolean comma, Attribute attribute) {
|
public final void writeFieldName(Attribute attribute) {
|
||||||
if (comma) writeTo(',');
|
if (this.comma) writeTo(',');
|
||||||
writeTo(true, attribute.field());
|
writeTo(true, attribute.field());
|
||||||
writeTo(':');
|
writeTo(':');
|
||||||
}
|
}
|
||||||
@@ -225,7 +225,8 @@ public class JsonWriter implements Writer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final void writeObjectB(int fieldCount, Object obj) {
|
public final void writeObjectB(Object obj) {
|
||||||
|
super.writeObjectB(obj);
|
||||||
writeTo('{');
|
writeTo('{');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user