# S03 — Custom serialiser and deserialiser renames
Guide: ("Custom Serializers and Deserializers: Class Renames")
[`before/S03CustomHandlers.java`](../jackson2-before/src/main/java/com/ankurm/migration/before/S03CustomHandlers.java) ·
[`after/S03CustomHandlers.java`](../jackson3-after/src/main/java/com/ankurm/migration/after/S03CustomHandlers.java)
If your project has custom handlers, this is where the upgrade time goes. Every item
below is a compile error until fixed.
| Jackson 2 | Jackson 3 |
|---|---|
| `JsonSerializer` | `ValueSerializer` |
| `JsonDeserializer` | `ValueDeserializer` |
| `SerializerProvider` | `SerializationContext` |
| `throws IOException` | remove — unchecked now |
| `gen.writeNumberField(...)` | `gen.writeNumberProperty(...)` |
| `gen.writeStringField(...)` | `gen.writeStringProperty(...)` |
| `p.getCodec().readTree(p)` | `ctxt.readTree(p)` |
| `new SimpleModule(name, Version)` | `new SimpleModule(name)` |
| `mapper.registerModule(m)` | `builder.addModule(m)` |
## Output
**Jackson 2 — `jackson2-before`**
```
serialised : {"amount":19.99,"currency":"USD"}
deserialised : Money[amount=20.0, currencyCode=USD]
base classes : com.fasterxml.jackson.databind.JsonSerializer / com.fasterxml.jackson.databind.JsonDeserializer
```
**Jackson 3 — `jackson3-after`**
```
serialised : {"amount":19.99,"currency":"USD"}
deserialised : Money[amount=20.0, currencyCode=USD]
base classes : tools.jackson.databind.ValueSerializer / tools.jackson.databind.ValueDeserializer
```
Identical JSON on both sides; only the base class names differ. That is the useful
result — this is a mechanical rename, not a behavioural change, so it is safe to do in
bulk with OpenRewrite and review as a diff.