This commit is contained in:
Redkale
2020-09-22 12:18:23 +08:00
parent b781868876
commit 56da72b16e
2 changed files with 30 additions and 20 deletions

View File

@@ -222,9 +222,10 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
*/ */
@Override @Override
public T convertFrom(final R in) { public T convertFrom(final R in) {
final String clazz = in.readObjectB(typeClass); R objin = objectReader(in);
final String clazz = objin.readObjectB(typeClass);
if (clazz == null) return null; if (clazz == null) return null;
if (!clazz.isEmpty()) return (T) factory.loadDecoder(factory.getEntityAlias(clazz)).convertFrom(in); if (!clazz.isEmpty()) return (T) factory.loadDecoder(factory.getEntityAlias(clazz)).convertFrom(objin);
if (!this.inited) { if (!this.inited) {
synchronized (lock) { synchronized (lock) {
try { try {
@@ -242,17 +243,17 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
if (this.creatorConstructorMembers == null) { //空构造函数 if (this.creatorConstructorMembers == null) { //空构造函数
final T result = this.creator == null ? null : this.creator.create(); final T result = this.creator == null ? null : this.creator.create();
boolean first = true; boolean first = true;
while (hasNext(in, first)) { while (hasNext(objin, first)) {
DeMember member = in.readFieldName(members); DeMember member = objin.readFieldName(members);
in.readBlank(); objin.readBlank();
if (member == null) { if (member == null) {
in.skipValue(); //跳过不存在的属性的值 objin.skipValue(); //跳过不存在的属性的值
} else { } else {
readMemberValue(in, member, result, first); readMemberValue(objin, member, result, first);
} }
first = false; first = false;
} }
in.readObjectE(typeClass); objin.readObjectE(typeClass);
return result; return result;
} else { //带参数的构造函数 } else { //带参数的构造函数
final DeMember<R, T, ?>[] fields = this.creatorConstructorMembers; final DeMember<R, T, ?>[] fields = this.creatorConstructorMembers;
@@ -260,13 +261,13 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
final Object[][] otherParams = new Object[this.members.length][2]; final Object[][] otherParams = new Object[this.members.length][2];
int oc = 0; int oc = 0;
boolean first = true; boolean first = true;
while (hasNext(in, first)) { while (hasNext(objin, first)) {
DeMember member = in.readFieldName(members); DeMember member = objin.readFieldName(members);
in.readBlank(); objin.readBlank();
if (member == null) { if (member == null) {
in.skipValue(); //跳过不存在的属性的值 objin.skipValue(); //跳过不存在的属性的值
} else { } else {
Object val = readMemberValue(in, member, first); Object val = readMemberValue(objin, member, first);
boolean flag = true; boolean flag = true;
for (int i = 0; i < fields.length; i++) { for (int i = 0; i < fields.length; i++) {
if (member == fields[i]) { if (member == fields[i]) {
@@ -280,7 +281,7 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
} }
first = false; first = false;
} }
in.readObjectE(typeClass); objin.readObjectE(typeClass);
if (this.creator == null) return null; if (this.creator == null) return null;
final T result = this.creator.create(constructorParams); final T result = this.creator.create(constructorParams);
for (int i = 0; i < oc; i++) { for (int i = 0; i < oc; i++) {
@@ -290,6 +291,10 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
} }
} }
protected R objectReader(R in) {
return in;
}
protected boolean hasNext(R in, boolean first) { protected boolean hasNext(R in, boolean first) {
return in.hasNext(); return in.hasNext();
} }

View File

@@ -163,25 +163,30 @@ public class ObjectEncoder<W extends Writer, T> implements Encodeable<W, T> {
factory.loadEncoder(clz).convertTo(out, value); factory.loadEncoder(clz).convertTo(out, value);
return; return;
} }
if (out.writeObjectB(value) < 0) { W objout = objectWriter(out, value);
if (objout.writeObjectB(value) < 0) {
int maxPosition = 0; int maxPosition = 0;
for (EnMember member : members) { for (EnMember member : members) {
maxPosition = member.getPosition(); maxPosition = member.getPosition();
out.writeObjectField(member, value); objout.writeObjectField(member, value);
} }
if (out.objExtFunc != null) { if (objout.objExtFunc != null) {
ConvertField[] extFields = out.objExtFunc.apply(value); ConvertField[] extFields = objout.objExtFunc.apply(value);
if (extFields != null) { if (extFields != null) {
Encodeable<W, ?> anyEncoder = factory.getAnyEncoder(); Encodeable<W, ?> anyEncoder = factory.getAnyEncoder();
for (ConvertField en : extFields) { for (ConvertField en : extFields) {
if (en == null) continue; if (en == null) continue;
maxPosition++; maxPosition++;
out.writeObjectField(en.getName(), en.getType(), Math.max(en.getPosition(), maxPosition), anyEncoder, en.getValue()); objout.writeObjectField(en.getName(), en.getType(), Math.max(en.getPosition(), maxPosition), anyEncoder, en.getValue());
} }
} }
} }
} }
out.writeObjectE(value); objout.writeObjectE(value);
}
protected W objectWriter(W out, T value) {
return out;
} }
@Override @Override