Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make JsonPointer java.io.Serializable #762

Merged
merged 5 commits into from
Jun 16, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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);

}
}