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      */

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      */

53     protected BeanSerializer(BeanSerializerBase src) {
54         super(src);
55     }
56
57     protected BeanSerializer(BeanSerializerBase src,
58             ObjectIdWriter objectIdWriter) {
59         super(src, objectIdWriter);
60     }
61
62     protected BeanSerializer(BeanSerializerBase src,
63             ObjectIdWriter objectIdWriter, Object filterId) {
64         super(src, objectIdWriter, filterId);
65     }
66
67     protected BeanSerializer(BeanSerializerBase src, Set<String> toIgnore) {
68         super(src, toIgnore);
69     }
70
71     // @since 2.11.1
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
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      */

98     public static BeanSerializer createDummy(JavaType forType, BeanSerializerBuilder builder)
99     {
100         return new BeanSerializer(forType, builder, NO_PROPS, null);
101     }
102
103     @Override
104     public JsonSerializer<Object> unwrappingSerializer(NameTransformer unwrapper) {
105         return new UnwrappingBeanSerializer(this, unwrapper);
106     }
107
108     @Override
109     public BeanSerializerBase withObjectIdWriter(ObjectIdWriter objectIdWriter) {
110         return new BeanSerializer(this, objectIdWriter, _propertyFilterId);
111     }
112
113     @Override
114     public BeanSerializerBase withFilterId(Object filterId) {
115         return new BeanSerializer(this, _objectIdWriter, filterId);
116     }
117
118     @Override
119     protected BeanSerializerBase withIgnorals(Set<String> toIgnore) {
120         return new BeanSerializer(this, toIgnore);
121     }
122
123     @Override // @since 2.11.1
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
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
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
189     @Override public String toString() {
190         return "BeanSerializer for "+handledType().getName();
191     }
192 }
193