Skip to content

Commit

Permalink
Make JsonPointer java.io.Serializable (#762)
Browse files Browse the repository at this point in the history
  • Loading branch information
egalpin authored Jun 16, 2022
1 parent 96657ef commit ca18393
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 3 deletions.
45 changes: 42 additions & 3 deletions src/main/java/com/fasterxml/jackson/core/JsonPointer.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
package com.fasterxml.jackson.core;

import com.fasterxml.jackson.core.io.NumberInput;
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.io.ObjectStreamException;
import java.io.Serializable;

/**
* Implementation of
Expand All @@ -17,8 +23,9 @@
*
* @since 2.3
*/
public class JsonPointer
public class JsonPointer implements Serializable
{
private static final long serialVersionUID = 1L;
/**
* Character used to separate segments.
*
Expand Down Expand Up @@ -59,7 +66,7 @@ public class JsonPointer
* so that {@link #toString} should be as efficient as possible.
*/
protected final String _asString;

protected final String _matchingPropertyName;

protected final int _matchingElementIndex;
Expand All @@ -69,7 +76,7 @@ public class JsonPointer
/* Construction
/**********************************************************
*/

/**
* Constructor used for creating "empty" instance, used to represent
* state that matches current node.
Expand Down Expand Up @@ -643,4 +650,36 @@ private static void _appendEscape(StringBuilder sb, char c) {
}
sb.append(c);
}

private Object writeReplace() {
return new SerializableJsonPointer(_asString);
}

/**
* This must only exist to allow both final properties and implementation of
* Externalizable/Serializable for JsonPointer
*/
private static class SerializableJsonPointer implements Externalizable {
private String _asString;

public SerializableJsonPointer() {
}

public SerializableJsonPointer(String asString) {
_asString = asString;
}

@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeUTF(_asString);
}

@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
_asString = in.readUTF();
}
private Object readResolve() throws ObjectStreamException {
return compile(_asString);
}
}
}
35 changes: 35 additions & 0 deletions src/test/java/com/fasterxml/jackson/core/TestJsonPointer.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
package com.fasterxml.jackson.core;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class TestJsonPointer extends BaseTest
{
public void testSimplePath() throws Exception
Expand Down Expand Up @@ -228,4 +235,32 @@ public void testLongNumbers() throws Exception
assertTrue(ptr.matches());
assertNull(ptr.tail());
}

private static <T extends Serializable> byte[] pickle(T obj)
throws IOException
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(obj);
oos.close();
return baos.toByteArray();
}

private static <T extends Serializable> T unpickle(byte[] b, Class<T> cl)
throws IOException, ClassNotFoundException
{
ByteArrayInputStream bais = new ByteArrayInputStream(b);
ObjectInputStream ois = new ObjectInputStream(bais);
Object o = ois.readObject();
return cl.cast(o);
}
public void testPointerSerialization() throws Exception {

final String INPUT = "/Image/15/name";
JsonPointer original = JsonPointer.compile(INPUT);
JsonPointer copy = unpickle(pickle(original), JsonPointer.class);
assertNotSame(copy, original);
assertEquals(original, copy);

}
}

0 comments on commit ca18393

Please sign in to comment.