Skip to content

Commit ca18393

Browse files
authored
Make JsonPointer java.io.Serializable (#762)
1 parent 96657ef commit ca18393

File tree

2 files changed

+77
-3
lines changed

2 files changed

+77
-3
lines changed

src/main/java/com/fasterxml/jackson/core/JsonPointer.java

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
package com.fasterxml.jackson.core;
22

33
import com.fasterxml.jackson.core.io.NumberInput;
4+
import java.io.Externalizable;
5+
import java.io.IOException;
6+
import java.io.ObjectInput;
7+
import java.io.ObjectOutput;
8+
import java.io.ObjectStreamException;
9+
import java.io.Serializable;
410

511
/**
612
* Implementation of
@@ -17,8 +23,9 @@
1723
*
1824
* @since 2.3
1925
*/
20-
public class JsonPointer
26+
public class JsonPointer implements Serializable
2127
{
28+
private static final long serialVersionUID = 1L;
2229
/**
2330
* Character used to separate segments.
2431
*
@@ -59,7 +66,7 @@ public class JsonPointer
5966
* so that {@link #toString} should be as efficient as possible.
6067
*/
6168
protected final String _asString;
62-
69+
6370
protected final String _matchingPropertyName;
6471

6572
protected final int _matchingElementIndex;
@@ -69,7 +76,7 @@ public class JsonPointer
6976
/* Construction
7077
/**********************************************************
7178
*/
72-
79+
7380
/**
7481
* Constructor used for creating "empty" instance, used to represent
7582
* state that matches current node.
@@ -643,4 +650,36 @@ private static void _appendEscape(StringBuilder sb, char c) {
643650
}
644651
sb.append(c);
645652
}
653+
654+
private Object writeReplace() {
655+
return new SerializableJsonPointer(_asString);
656+
}
657+
658+
/**
659+
* This must only exist to allow both final properties and implementation of
660+
* Externalizable/Serializable for JsonPointer
661+
*/
662+
private static class SerializableJsonPointer implements Externalizable {
663+
private String _asString;
664+
665+
public SerializableJsonPointer() {
666+
}
667+
668+
public SerializableJsonPointer(String asString) {
669+
_asString = asString;
670+
}
671+
672+
@Override
673+
public void writeExternal(ObjectOutput out) throws IOException {
674+
out.writeUTF(_asString);
675+
}
676+
677+
@Override
678+
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
679+
_asString = in.readUTF();
680+
}
681+
private Object readResolve() throws ObjectStreamException {
682+
return compile(_asString);
683+
}
684+
}
646685
}

src/test/java/com/fasterxml/jackson/core/TestJsonPointer.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
package com.fasterxml.jackson.core;
22

3+
import java.io.ByteArrayInputStream;
4+
import java.io.ByteArrayOutputStream;
5+
import java.io.IOException;
6+
import java.io.ObjectInputStream;
7+
import java.io.ObjectOutputStream;
8+
import java.io.Serializable;
9+
310
public class TestJsonPointer extends BaseTest
411
{
512
public void testSimplePath() throws Exception
@@ -228,4 +235,32 @@ public void testLongNumbers() throws Exception
228235
assertTrue(ptr.matches());
229236
assertNull(ptr.tail());
230237
}
238+
239+
private static <T extends Serializable> byte[] pickle(T obj)
240+
throws IOException
241+
{
242+
ByteArrayOutputStream baos = new ByteArrayOutputStream();
243+
ObjectOutputStream oos = new ObjectOutputStream(baos);
244+
oos.writeObject(obj);
245+
oos.close();
246+
return baos.toByteArray();
247+
}
248+
249+
private static <T extends Serializable> T unpickle(byte[] b, Class<T> cl)
250+
throws IOException, ClassNotFoundException
251+
{
252+
ByteArrayInputStream bais = new ByteArrayInputStream(b);
253+
ObjectInputStream ois = new ObjectInputStream(bais);
254+
Object o = ois.readObject();
255+
return cl.cast(o);
256+
}
257+
public void testPointerSerialization() throws Exception {
258+
259+
final String INPUT = "/Image/15/name";
260+
JsonPointer original = JsonPointer.compile(INPUT);
261+
JsonPointer copy = unpickle(pickle(original), JsonPointer.class);
262+
assertNotSame(copy, original);
263+
assertEquals(original, copy);
264+
265+
}
231266
}

0 commit comments

Comments
 (0)