aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com/fasterxml/jackson/databind/ser/BeanSerializer.java
diff options
context:
space:
mode:
authorTatu <tatu@ning.com>2012-02-07 19:47:33 -0800
committerTatu <tatu@ning.com>2012-02-07 19:47:33 -0800
commit58077e9d135f0285a361a1d89b3767c5ece0095a (patch)
tree417252fa670e39ac280c93811755d40d20d7cb1b /src/main/java/com/fasterxml/jackson/databind/ser/BeanSerializer.java
parentd453182b63249c2c597a54229a4242e1ce1921d0 (diff)
downloadjackson-databind-58077e9d135f0285a361a1d89b3767c5ece0095a.tar.gz
Ok, Object Id handling back to working as good as before refactoring, i.e. just for serialization...
Diffstat (limited to 'src/main/java/com/fasterxml/jackson/databind/ser/BeanSerializer.java')
-rw-r--r--src/main/java/com/fasterxml/jackson/databind/ser/BeanSerializer.java51
1 files changed, 30 insertions, 21 deletions
diff --git a/src/main/java/com/fasterxml/jackson/databind/ser/BeanSerializer.java b/src/main/java/com/fasterxml/jackson/databind/ser/BeanSerializer.java
index 6b2db52a2..bc32a4984 100644
--- a/src/main/java/com/fasterxml/jackson/databind/ser/BeanSerializer.java
+++ b/src/main/java/com/fasterxml/jackson/databind/ser/BeanSerializer.java
@@ -2,9 +2,11 @@ package com.fasterxml.jackson.databind.ser;
import java.io.IOException;
+import com.fasterxml.jackson.annotation.ObjectIdGenerator;
import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.*;
+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;
@@ -40,15 +42,7 @@ public class BeanSerializer
{
super(type, builder, properties, filteredProperties);
}
-
- /**
- * Copy-constructor that is useful for sub-classes that just want to
- * copy all super-class properties without modifications.
- */
- protected BeanSerializer(BeanSerializer src) {
- super(src);
- }
-
+
/**
* Alternate copy constructor that can be used to construct
* standard {@link BeanSerializer} passing an instance of
@@ -57,6 +51,10 @@ public class BeanSerializer
protected BeanSerializer(BeanSerializerBase src) {
super(src);
}
+
+ protected BeanSerializer(BeanSerializerBase src, ObjectIdWriter objectIdWriter) {
+ super(src, objectIdWriter);
+ }
/*
/**********************************************************
@@ -77,6 +75,11 @@ public class BeanSerializer
public JsonSerializer<Object> unwrappingSerializer(NameTransformer unwrapper) {
return new UnwrappingBeanSerializer(this, unwrapper);
}
+
+ @Override
+ protected BeanSerializer withObjectIdWriter(ObjectIdWriter objectIdWriter) {
+ return new BeanSerializer(this, objectIdWriter);
+ }
/*
/**********************************************************
@@ -93,7 +96,7 @@ public class BeanSerializer
public final void serialize(Object bean, JsonGenerator jgen, SerializerProvider provider)
throws IOException, JsonGenerationException
{
- if (_objectIdHandler != null) {
+ if (_objectIdWriter != null) {
serializeWithObjectId(bean, jgen, provider);
return;
}
@@ -109,19 +112,25 @@ public class BeanSerializer
private final void serializeWithObjectId(Object bean, JsonGenerator jgen, SerializerProvider provider)
throws IOException, JsonGenerationException
{
+ final ObjectIdWriter w = _objectIdWriter;
// Ok: if we have seen this POJO before, just write the reference:
- if (_objectIdHandler.handleReference(bean, jgen, provider)) {
- return;
- }
- // If not, need to inject the id:
- jgen.writeStartObject();
- _objectIdHandler.writeAsProperty(bean, jgen, provider);
- if (_propertyFilterId != null) {
- serializeFieldsFiltered(bean, jgen, provider);
- } else {
- serializeFields(bean, jgen, provider);
+ ObjectIdGenerator<?> gen = provider.objectIdsFor(_objectIdWriter.generator);
+ Object id = gen.findId(bean);
+ if (id == null) { // first time around: must generate
+ id = gen.generateId(bean);
+ // If not, need to inject the id:
+ jgen.writeStartObject();
+ jgen.writeFieldName(w.propertyName);
+ w.serializer.serialize(id, jgen, provider);
+ if (_propertyFilterId != null) {
+ serializeFieldsFiltered(bean, jgen, provider);
+ } else {
+ serializeFields(bean, jgen, provider);
+ }
+ jgen.writeEndObject();
+ } else { // already generated; use one we have
+ w.serializer.serialize(id, jgen, provider);
}
- jgen.writeEndObject();
}
/*