• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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