package com.fasterxml.jackson.databind.ser;

import java.io.IOException;
import java.util.Set;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.ser.impl.BeanAsArraySerializer;
import com.fasterxml.jackson.databind.ser.impl.ObjectIdWriter;
import com.fasterxml.jackson.databind.ser.impl.UnwrappingBeanSerializer;
import com.fasterxml.jackson.databind.ser.std.BeanSerializerBase;
import com.fasterxml.jackson.databind.util.NameTransformer;

Serializer class that can serialize Java objects that map to JSON Object output. Internally handling is mostly dealt with by a sequence of BeanPropertyWriters that will handle access value to serialize and call appropriate serializers to write out JSON.

Implementation note: we will post-process resulting serializer, to figure out actual serializers for final types. This must be done from BeanSerializerBase.resolve method, and NOT from constructor; otherwise we could end up with an infinite loop.

/** * Serializer class that can serialize Java objects that map * to JSON Object output. Internally handling is mostly dealt with * by a sequence of {@link BeanPropertyWriter}s that will handle * access value to serialize and call appropriate serializers to * write out JSON. *<p> * Implementation note: we will post-process resulting serializer, * to figure out actual serializers for final types. This must be * done from {@link #resolve} method, and NOT from constructor; * otherwise we could end up with an infinite loop. */
public class BeanSerializer extends BeanSerializerBase { private static final long serialVersionUID = 29; // as per jackson 2.9 /* /********************************************************** /* Life-cycle: constructors /********************************************************** */
Params:
  • builder – Builder object that contains collected information that may be needed for serializer
  • properties – Property writers used for actual serialization
/** * @param builder Builder object that contains collected information * that may be needed for serializer * @param properties Property writers used for actual serialization */
public BeanSerializer(JavaType type, BeanSerializerBuilder builder, BeanPropertyWriter[] properties, BeanPropertyWriter[] filteredProperties) { super(type, builder, properties, filteredProperties); }
Alternate copy constructor that can be used to construct standard BeanSerializer passing an instance of "compatible enough" source serializer.
/** * Alternate copy constructor that can be used to construct * standard {@link BeanSerializer} passing an instance of * "compatible enough" source serializer. */
protected BeanSerializer(BeanSerializerBase src) { super(src); } protected BeanSerializer(BeanSerializerBase src, ObjectIdWriter objectIdWriter) { super(src, objectIdWriter); } protected BeanSerializer(BeanSerializerBase src, ObjectIdWriter objectIdWriter, Object filterId) { super(src, objectIdWriter, filterId); } protected BeanSerializer(BeanSerializerBase src, Set<String> toIgnore) { super(src, toIgnore); } /* /********************************************************** /* Life-cycle: factory methods, fluent factories /********************************************************** */
Method for constructing dummy bean serializer; one that never outputs any properties
/** * Method for constructing dummy bean serializer; one that * never outputs any properties */
public static BeanSerializer createDummy(JavaType forType) { return new BeanSerializer(forType, null, NO_PROPS, null); } @Override public JsonSerializer<Object> unwrappingSerializer(NameTransformer unwrapper) { return new UnwrappingBeanSerializer(this, unwrapper); } @Override public BeanSerializerBase withObjectIdWriter(ObjectIdWriter objectIdWriter) { return new BeanSerializer(this, objectIdWriter, _propertyFilterId); } @Override public BeanSerializerBase withFilterId(Object filterId) { return new BeanSerializer(this, _objectIdWriter, filterId); } @Override protected BeanSerializerBase withIgnorals(Set<String> toIgnore) { return new BeanSerializer(this, toIgnore); }
Implementation has to check whether as-array serialization is possible reliably; if (and only if) so, will construct a BeanAsArraySerializer, otherwise will return this serializer as is.
/** * Implementation has to check whether as-array serialization * is possible reliably; if (and only if) so, will construct * a {@link BeanAsArraySerializer}, otherwise will return this * serializer as is. */
@Override protected BeanSerializerBase asArraySerializer() { /* Cannot: * * - have Object Id (may be allowed in future) * - have "any getter" * - have per-property filters */ if ((_objectIdWriter == null) && (_anyGetterWriter == null) && (_propertyFilterId == null) ) { return new BeanAsArraySerializer(this); } // already is one, so: return this; } /* /********************************************************** /* JsonSerializer implementation that differs between impls /********************************************************** */
Main serialization method that will delegate actual output to configured BeanPropertyWriter instances.
/** * Main serialization method that will delegate actual output to * configured * {@link BeanPropertyWriter} instances. */
@Override public final void serialize(Object bean, JsonGenerator gen, SerializerProvider provider) throws IOException { if (_objectIdWriter != null) { gen.setCurrentValue(bean); // [databind#631] _serializeWithObjectId(bean, gen, provider, true); return; } gen.writeStartObject(bean); if (_propertyFilterId != null) { serializeFieldsFiltered(bean, gen, provider); } else { serializeFields(bean, gen, provider); } gen.writeEndObject(); } /* /********************************************************** /* Standard methods /********************************************************** */ @Override public String toString() { return "BeanSerializer for "+handledType().getName(); } }