| package org.codehaus.jackson.map.ser.std; |
| |
| import java.io.IOException; |
| import java.util.Iterator; |
| |
| import org.codehaus.jackson.JsonGenerationException; |
| import org.codehaus.jackson.JsonGenerator; |
| import org.codehaus.jackson.map.BeanProperty; |
| import org.codehaus.jackson.map.JsonSerializer; |
| import org.codehaus.jackson.map.SerializerProvider; |
| import org.codehaus.jackson.map.TypeSerializer; |
| import org.codehaus.jackson.map.annotate.JacksonStdImpl; |
| import org.codehaus.jackson.type.JavaType; |
| |
| @JacksonStdImpl |
| public class IterableSerializer |
| extends AsArraySerializerBase<Iterable<?>> |
| { |
| public IterableSerializer(JavaType elemType, boolean staticTyping, TypeSerializer vts, BeanProperty property) |
| { |
| super(Iterable.class, elemType, staticTyping, vts, property, null); |
| } |
| |
| @Override |
| public ContainerSerializerBase<?> _withValueTypeSerializer(TypeSerializer vts) { |
| return new IterableSerializer(_elementType, _staticTyping, vts, _property); |
| } |
| |
| @Override |
| public void serializeContents(Iterable<?> value, JsonGenerator jgen, SerializerProvider provider) |
| throws IOException, JsonGenerationException |
| { |
| Iterator<?> it = value.iterator(); |
| if (it.hasNext()) { |
| final TypeSerializer typeSer = _valueTypeSerializer; |
| JsonSerializer<Object> prevSerializer = null; |
| Class<?> prevClass = null; |
| |
| do { |
| Object elem = it.next(); |
| if (elem == null) { |
| provider.defaultSerializeNull(jgen); |
| } else { |
| // Minor optimization to avoid most lookups: |
| Class<?> cc = elem.getClass(); |
| JsonSerializer<Object> currSerializer; |
| if (cc == prevClass) { |
| currSerializer = prevSerializer; |
| } else { |
| currSerializer = provider.findValueSerializer(cc, _property); |
| prevSerializer = currSerializer; |
| prevClass = cc; |
| } |
| if (typeSer == null) { |
| currSerializer.serialize(elem, jgen, provider); |
| } else { |
| currSerializer.serializeWithType(elem, jgen, provider, typeSer); |
| } |
| } |
| } while (it.hasNext()); |
| } |
| } |
| } |