1 package com.fasterxml.jackson.databind.ser; 2 3 import java.io.IOException; 4 import java.util.Set; 5 6 import com.fasterxml.jackson.core.JsonGenerator; 7 import com.fasterxml.jackson.databind.*; 8 import com.fasterxml.jackson.databind.ser.impl.BeanAsArraySerializer; 9 import com.fasterxml.jackson.databind.ser.impl.ObjectIdWriter; 10 import com.fasterxml.jackson.databind.ser.impl.UnwrappingBeanSerializer; 11 import com.fasterxml.jackson.databind.ser.std.BeanSerializerBase; 12 import com.fasterxml.jackson.databind.util.NameTransformer; 13 14 /** 15 * Serializer class that can serialize Java objects that map 16 * to JSON Object output. Internally handling is mostly dealt with 17 * by a sequence of {@link BeanPropertyWriter}s that will handle 18 * access value to serialize and call appropriate serializers to 19 * write out JSON. 20 *<p> 21 * Implementation note: we will post-process resulting serializer, 22 * to figure out actual serializers for final types. This must be 23 * done from {@link #resolve} method, and NOT from constructor; 24 * otherwise we could end up with an infinite loop. 25 */ 26 public class BeanSerializer 27 extends BeanSerializerBase 28 { 29 private static final long serialVersionUID = 29; // as per jackson 2.9 30 31 /* 32 /********************************************************** 33 /* Life-cycle: constructors 34 /********************************************************** 35 */ 36 37 /** 38 * @param builder Builder object that contains collected information 39 * that may be needed for serializer 40 * @param properties Property writers used for actual serialization 41 */ BeanSerializer(JavaType type, BeanSerializerBuilder builder, BeanPropertyWriter[] properties, BeanPropertyWriter[] filteredProperties)42 public BeanSerializer(JavaType type, BeanSerializerBuilder builder, 43 BeanPropertyWriter[] properties, BeanPropertyWriter[] filteredProperties) 44 { 45 super(type, builder, properties, filteredProperties); 46 } 47 48 /** 49 * Alternate copy constructor that can be used to construct 50 * standard {@link BeanSerializer} passing an instance of 51 * "compatible enough" source serializer. 52 */ BeanSerializer(BeanSerializerBase src)53 protected BeanSerializer(BeanSerializerBase src) { 54 super(src); 55 } 56 BeanSerializer(BeanSerializerBase src, ObjectIdWriter objectIdWriter)57 protected BeanSerializer(BeanSerializerBase src, 58 ObjectIdWriter objectIdWriter) { 59 super(src, objectIdWriter); 60 } 61 BeanSerializer(BeanSerializerBase src, ObjectIdWriter objectIdWriter, Object filterId)62 protected BeanSerializer(BeanSerializerBase src, 63 ObjectIdWriter objectIdWriter, Object filterId) { 64 super(src, objectIdWriter, filterId); 65 } 66 BeanSerializer(BeanSerializerBase src, Set<String> toIgnore, Set<String> toInclude)67 protected BeanSerializer(BeanSerializerBase src, Set<String> toIgnore, Set<String> toInclude) { 68 super(src, toIgnore, toInclude); 69 } 70 71 // @since 2.11.1 BeanSerializer(BeanSerializerBase src, BeanPropertyWriter[] properties, BeanPropertyWriter[] filteredProperties)72 protected BeanSerializer(BeanSerializerBase src, 73 BeanPropertyWriter[] properties, BeanPropertyWriter[] filteredProperties) { 74 super(src, properties, filteredProperties); 75 } 76 77 /* 78 /********************************************************** 79 /* Life-cycle: factory methods, fluent factories 80 /********************************************************** 81 */ 82 83 /** 84 * @deprecated Since 2.10 85 */ 86 @Deprecated createDummy(JavaType forType)87 public static BeanSerializer createDummy(JavaType forType) 88 { 89 return new BeanSerializer(forType, null, NO_PROPS, null); 90 } 91 92 /** 93 * Method for constructing dummy bean serializer; one that 94 * never outputs any properties 95 * 96 * @since 2.10 97 */ createDummy(JavaType forType, BeanSerializerBuilder builder)98 public static BeanSerializer createDummy(JavaType forType, BeanSerializerBuilder builder) 99 { 100 return new BeanSerializer(forType, builder, NO_PROPS, null); 101 } 102 103 @Override unwrappingSerializer(NameTransformer unwrapper)104 public JsonSerializer<Object> unwrappingSerializer(NameTransformer unwrapper) { 105 return new UnwrappingBeanSerializer(this, unwrapper); 106 } 107 108 @Override withObjectIdWriter(ObjectIdWriter objectIdWriter)109 public BeanSerializerBase withObjectIdWriter(ObjectIdWriter objectIdWriter) { 110 return new BeanSerializer(this, objectIdWriter, _propertyFilterId); 111 } 112 113 @Override withFilterId(Object filterId)114 public BeanSerializerBase withFilterId(Object filterId) { 115 return new BeanSerializer(this, _objectIdWriter, filterId); 116 } 117 118 @Override // @since 2.12 withByNameInclusion(Set<String> toIgnore, Set<String> toInclude)119 protected BeanSerializerBase withByNameInclusion(Set<String> toIgnore, Set<String> toInclude) { 120 return new BeanSerializer(this, toIgnore, toInclude); 121 } 122 123 @Override // @since 2.11.1 withProperties(BeanPropertyWriter[] properties, BeanPropertyWriter[] filteredProperties)124 protected BeanSerializerBase withProperties(BeanPropertyWriter[] properties, 125 BeanPropertyWriter[] filteredProperties) { 126 return new BeanSerializer(this, properties, filteredProperties); 127 } 128 129 /** 130 * Implementation has to check whether as-array serialization 131 * is possible reliably; if (and only if) so, will construct 132 * a {@link BeanAsArraySerializer}, otherwise will return this 133 * serializer as is. 134 */ 135 @Override asArraySerializer()136 protected BeanSerializerBase asArraySerializer() 137 { 138 /* Cannot: 139 * 140 * - have Object Id (may be allowed in future) 141 * - have "any getter" 142 * - have per-property filters 143 */ 144 if ((_objectIdWriter == null) 145 && (_anyGetterWriter == null) 146 && (_propertyFilterId == null) 147 ) { 148 return new BeanAsArraySerializer(this); 149 } 150 // already is one, so: 151 return this; 152 } 153 154 /* 155 /********************************************************** 156 /* JsonSerializer implementation that differs between impls 157 /********************************************************** 158 */ 159 160 /** 161 * Main serialization method that will delegate actual output to 162 * configured 163 * {@link BeanPropertyWriter} instances. 164 */ 165 @Override serialize(Object bean, JsonGenerator gen, SerializerProvider provider)166 public final void serialize(Object bean, JsonGenerator gen, SerializerProvider provider) 167 throws IOException 168 { 169 if (_objectIdWriter != null) { 170 gen.setCurrentValue(bean); // [databind#631] 171 _serializeWithObjectId(bean, gen, provider, true); 172 return; 173 } 174 gen.writeStartObject(bean); 175 if (_propertyFilterId != null) { 176 serializeFieldsFiltered(bean, gen, provider); 177 } else { 178 serializeFields(bean, gen, provider); 179 } 180 gen.writeEndObject(); 181 } 182 183 /* 184 /********************************************************** 185 /* Standard methods 186 /********************************************************** 187 */ 188 toString()189 @Override public String toString() { 190 return "BeanSerializer for "+handledType().getName(); 191 } 192 } 193