From 47f723e63bd3edc967a17444287d08b4585a6e43 Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Thu, 15 Dec 2016 09:54:23 +0800 Subject: [PATCH] --- src/org/redkale/convert/ArrayDecoder.java | 50 +++++++++++++------ src/org/redkale/convert/ArrayEncoder.java | 42 ++++++++++++---- .../redkale/convert/CollectionDecoder.java | 38 +++++++++++--- .../redkale/convert/CollectionEncoder.java | 42 ++++++++++++---- src/org/redkale/convert/MapDecoder.java | 46 +++++++++++++---- src/org/redkale/convert/MapEncoder.java | 37 +++++++++++--- 6 files changed, 196 insertions(+), 59 deletions(-) diff --git a/src/org/redkale/convert/ArrayDecoder.java b/src/org/redkale/convert/ArrayDecoder.java index a404a30e1..f83e87f0e 100644 --- a/src/org/redkale/convert/ArrayDecoder.java +++ b/src/org/redkale/convert/ArrayDecoder.java @@ -30,29 +30,51 @@ public final class ArrayDecoder implements Decodeable { protected final Decodeable decoder; + private boolean inited = false; + + private final Object lock = new Object(); + public ArrayDecoder(final ConvertFactory factory, final Type type) { this.type = type; - if (type instanceof GenericArrayType) { - Type t = ((GenericArrayType) type).getGenericComponentType(); - this.componentType = t instanceof TypeVariable ? Object.class : t; - } else if ((type instanceof Class) && ((Class) type).isArray()) { - this.componentType = ((Class) type).getComponentType(); - } else { - throw new ConvertException("(" + type + ") is not a array type"); + try { + if (type instanceof GenericArrayType) { + Type t = ((GenericArrayType) type).getGenericComponentType(); + this.componentType = t instanceof TypeVariable ? Object.class : t; + } else if ((type instanceof Class) && ((Class) type).isArray()) { + this.componentType = ((Class) type).getComponentType(); + } else { + throw new ConvertException("(" + type + ") is not a array type"); + } + if (this.componentType instanceof ParameterizedType) { + this.componentClass = (Class) ((ParameterizedType) this.componentType).getRawType(); + } else { + this.componentClass = (Class) this.componentType; + } + factory.register(type, this); + this.decoder = factory.loadDecoder(this.componentType); + } finally { + inited = true; + synchronized (lock) { + lock.notifyAll(); + } } - if (this.componentType instanceof ParameterizedType) { - this.componentClass = (Class) ((ParameterizedType) this.componentType).getRawType(); - } else { - this.componentClass = (Class) this.componentType; - } - factory.register(type, this); - this.decoder = factory.loadDecoder(this.componentType); } @Override public T[] convertFrom(Reader in) { final int len = in.readArrayB(); if (len == Reader.SIGN_NULL) return null; + if (this.decoder == null) { + if (!this.inited) { + synchronized (lock) { + try { + lock.wait(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } final Decodeable localdecoder = this.decoder; final List result = new ArrayList(); if (len == Reader.SIGN_NOLENGTH) { diff --git a/src/org/redkale/convert/ArrayEncoder.java b/src/org/redkale/convert/ArrayEncoder.java index 6c004194e..d2aebd34b 100644 --- a/src/org/redkale/convert/ArrayEncoder.java +++ b/src/org/redkale/convert/ArrayEncoder.java @@ -29,19 +29,30 @@ public final class ArrayEncoder implements Encodeable { private final Encodeable encoder; + private boolean inited = false; + + private final Object lock = new Object(); + public ArrayEncoder(final ConvertFactory factory, final Type type) { this.type = type; - if (type instanceof GenericArrayType) { - Type t = ((GenericArrayType) type).getGenericComponentType(); - this.componentType = t instanceof TypeVariable ? Object.class : t; - } else if ((type instanceof Class) && ((Class) type).isArray()) { - this.componentType = ((Class) type).getComponentType(); - } else { - throw new ConvertException("(" + type + ") is not a array type"); + try { + if (type instanceof GenericArrayType) { + Type t = ((GenericArrayType) type).getGenericComponentType(); + this.componentType = t instanceof TypeVariable ? Object.class : t; + } else if ((type instanceof Class) && ((Class) type).isArray()) { + this.componentType = ((Class) type).getComponentType(); + } else { + throw new ConvertException("(" + type + ") is not a array type"); + } + factory.register(type, this); + this.encoder = factory.loadEncoder(this.componentType); + this.anyEncoder = factory.getAnyEncoder(); + } finally { + inited = true; + synchronized (lock) { + lock.notifyAll(); + } } - factory.register(type, this); - this.encoder = factory.loadEncoder(this.componentType); - this.anyEncoder = factory.getAnyEncoder(); } @Override @@ -55,6 +66,17 @@ public final class ArrayEncoder implements Encodeable { out.writeArrayE(); return; } + if (this.encoder == null) { + if (!this.inited) { + synchronized (lock) { + try { + lock.wait(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } out.writeArrayB(value.length); final Type comp = this.componentType; boolean first = true; diff --git a/src/org/redkale/convert/CollectionDecoder.java b/src/org/redkale/convert/CollectionDecoder.java index db5545eb5..65b1850d7 100644 --- a/src/org/redkale/convert/CollectionDecoder.java +++ b/src/org/redkale/convert/CollectionDecoder.java @@ -32,16 +32,27 @@ public final class CollectionDecoder implements Decodeable decoder; + private boolean inited = false; + + private final Object lock = new Object(); + public CollectionDecoder(final ConvertFactory factory, final Type type) { this.type = type; - if (type instanceof ParameterizedType) { - final ParameterizedType pt = (ParameterizedType) type; - this.componentType = pt.getActualTypeArguments()[0]; - this.creator = factory.loadCreator((Class) pt.getRawType()); - factory.register(type, this); - this.decoder = factory.loadDecoder(this.componentType); - } else { - throw new ConvertException("collectiondecoder not support the type (" + type + ")"); + try { + if (type instanceof ParameterizedType) { + final ParameterizedType pt = (ParameterizedType) type; + this.componentType = pt.getActualTypeArguments()[0]; + this.creator = factory.loadCreator((Class) pt.getRawType()); + factory.register(type, this); + this.decoder = factory.loadDecoder(this.componentType); + } else { + throw new ConvertException("collectiondecoder not support the type (" + type + ")"); + } + } finally { + inited = true; + synchronized (lock) { + lock.notifyAll(); + } } } @@ -49,6 +60,17 @@ public final class CollectionDecoder implements Decodeable convertFrom(Reader in) { final int len = in.readArrayB(); if (len == Reader.SIGN_NULL) return null; + if (this.decoder == null) { + if (!this.inited) { + synchronized (lock) { + try { + lock.wait(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } final Decodeable localdecoder = this.decoder; final Collection result = this.creator.create(); if (len == Reader.SIGN_NOLENGTH) { diff --git a/src/org/redkale/convert/CollectionEncoder.java b/src/org/redkale/convert/CollectionEncoder.java index 8702ce927..2b8a8dfde 100644 --- a/src/org/redkale/convert/CollectionEncoder.java +++ b/src/org/redkale/convert/CollectionEncoder.java @@ -10,10 +10,12 @@ import java.util.Collection; /** * 对象集合的序列化. - * 集合大小不能超过 32767。 在BSON中集合大小设定的是short,对于大于32767长度的集合传输会影响性能,所以没有采用int存储。 + * 集合大小不能超过 32767。 在BSON中集合大小设定的是short,对于大于32767长度的集合传输会影响性能,所以没有采用int存储。 * 支持一定程度的泛型。 * - *

详情见: https://redkale.org + *

+ * 详情见: https://redkale.org + * * @author zhangjx * @param 序列化的集合元素类型 */ @@ -24,17 +26,28 @@ public final class CollectionEncoder implements Encodeable encoder; + private boolean inited = false; + + private final Object lock = new Object(); + public CollectionEncoder(final ConvertFactory factory, final Type type) { this.type = type; - if (type instanceof ParameterizedType) { - Type t = ((ParameterizedType) type).getActualTypeArguments()[0]; - if (t instanceof TypeVariable) { - this.encoder = factory.getAnyEncoder(); + try { + if (type instanceof ParameterizedType) { + Type t = ((ParameterizedType) type).getActualTypeArguments()[0]; + if (t instanceof TypeVariable) { + this.encoder = factory.getAnyEncoder(); + } else { + this.encoder = factory.loadEncoder(t); + } } else { - this.encoder = factory.loadEncoder(t); + this.encoder = factory.getAnyEncoder(); + } + } finally { + inited = true; + synchronized (lock) { + lock.notifyAll(); } - } else { - this.encoder = factory.getAnyEncoder(); } } @@ -49,6 +62,17 @@ public final class CollectionEncoder implements Encodeable 详情见: https://redkale.org + *

+ * 详情见: https://redkale.org + * * @author zhangjx * @param Map key的数据类型 * @param Map value的数据类型 @@ -32,23 +34,45 @@ public final class MapDecoder implements Decodeable> { protected final Decodeable valueDecoder; + private boolean inited = false; + + private final Object lock = new Object(); + public MapDecoder(final ConvertFactory factory, final Type type) { this.type = type; - if (type instanceof ParameterizedType) { - final ParameterizedType pt = (ParameterizedType) type; - this.keyType = pt.getActualTypeArguments()[0]; - this.valueType = pt.getActualTypeArguments()[1]; - this.creator = factory.loadCreator((Class) pt.getRawType()); - factory.register(type, this); - this.keyDecoder = factory.loadDecoder(this.keyType); - this.valueDecoder = factory.loadDecoder(this.valueType); - } else { - throw new ConvertException("mapdecoder not support the type (" + type + ")"); + try { + if (type instanceof ParameterizedType) { + final ParameterizedType pt = (ParameterizedType) type; + this.keyType = pt.getActualTypeArguments()[0]; + this.valueType = pt.getActualTypeArguments()[1]; + this.creator = factory.loadCreator((Class) pt.getRawType()); + factory.register(type, this); + this.keyDecoder = factory.loadDecoder(this.keyType); + this.valueDecoder = factory.loadDecoder(this.valueType); + } else { + throw new ConvertException("mapdecoder not support the type (" + type + ")"); + } + } finally { + inited = true; + synchronized (lock) { + lock.notifyAll(); + } } } @Override public Map convertFrom(Reader in) { + if (this.keyDecoder == null || this.valueDecoder == null) { + if (!this.inited) { + synchronized (lock) { + try { + lock.wait(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } final int len = in.readMapB(); if (len == Reader.SIGN_NULL) return null; final Map result = this.creator.create(); diff --git a/src/org/redkale/convert/MapEncoder.java b/src/org/redkale/convert/MapEncoder.java index bd728bc98..687941ee5 100644 --- a/src/org/redkale/convert/MapEncoder.java +++ b/src/org/redkale/convert/MapEncoder.java @@ -27,15 +27,26 @@ public final class MapEncoder implements Encodeable> { private final Encodeable valencoder; + private boolean inited = false; + + private final Object lock = new Object(); + public MapEncoder(final ConvertFactory factory, final Type type) { this.type = type; - if (type instanceof ParameterizedType) { - final Type[] pt = ((ParameterizedType) type).getActualTypeArguments(); - this.keyencoder = factory.loadEncoder(pt[0]); - this.valencoder = factory.loadEncoder(pt[1]); - } else { - this.keyencoder = factory.getAnyEncoder(); - this.valencoder = factory.getAnyEncoder(); + try { + if (type instanceof ParameterizedType) { + final Type[] pt = ((ParameterizedType) type).getActualTypeArguments(); + this.keyencoder = factory.loadEncoder(pt[0]); + this.valencoder = factory.loadEncoder(pt[1]); + } else { + this.keyencoder = factory.getAnyEncoder(); + this.valencoder = factory.getAnyEncoder(); + } + } finally { + inited = true; + synchronized (lock) { + lock.notifyAll(); + } } } @@ -46,6 +57,18 @@ public final class MapEncoder implements Encodeable> { out.writeNull(); return; } + + if (this.keyencoder == null || this.valencoder == null) { + if (!this.inited) { + synchronized (lock) { + try { + lock.wait(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } out.writeMapB(values.size()); boolean first = true; for (Map.Entry en : values.entrySet()) {