This commit is contained in:
地平线
2015-10-28 16:26:25 +08:00
parent 9399065346
commit f5a152dd50
2 changed files with 62 additions and 43 deletions

View File

@@ -129,7 +129,6 @@ public final class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T
} }
} }
} }
final T result = this.creator.create(); final T result = this.creator.create();
final AtomicInteger index = new AtomicInteger(); final AtomicInteger index = new AtomicInteger();
while (in.hasNext()) { while (in.hasNext()) {

View File

@@ -28,6 +28,10 @@ public final class ObjectEncoder<W extends Writer, T> implements Encodeable<W, T
protected Factory factory; protected Factory factory;
private boolean inited = false;
private final Object lock = new Object();
protected ObjectEncoder(Type type) { protected ObjectEncoder(Type type) {
this.type = type; this.type = type;
if (type instanceof ParameterizedType) { if (type instanceof ParameterizedType) {
@@ -131,6 +135,7 @@ public final class ObjectEncoder<W extends Writer, T> implements Encodeable<W, T
public void init(final Factory factory) { public void init(final Factory factory) {
this.factory = factory; this.factory = factory;
try {
if (type == Object.class) return; if (type == Object.class) return;
//if (!(type instanceof Class)) throw new ConvertException("[" + type + "] is no a class"); //if (!(type instanceof Class)) throw new ConvertException("[" + type + "] is no a class");
final Class clazz = this.typeClass; final Class clazz = this.typeClass;
@@ -178,6 +183,12 @@ public final class ObjectEncoder<W extends Writer, T> implements Encodeable<W, T
} catch (Exception ex) { } catch (Exception ex) {
throw new ConvertException(ex); throw new ConvertException(ex);
} }
} finally {
inited = true;
synchronized (lock) {
lock.notifyAll();
}
}
} }
@Override @Override
@@ -187,6 +198,15 @@ public final class ObjectEncoder<W extends Writer, T> implements Encodeable<W, T
out.writeNull(); out.writeNull();
return; return;
} }
if (!this.inited) {
synchronized (lock) {
try {
lock.wait();
} catch (Exception e) {
e.printStackTrace();
}
}
}
if (value != null && value.getClass() != this.typeClass) { if (value != null && value.getClass() != this.typeClass) {
final Class clz = value.getClass(); final Class clz = value.getClass();
out.wirteClassName(factory.getEntity(clz)); out.wirteClassName(factory.getEntity(clz));