Skip to content
Open
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
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package com.launchdarkly.sdk;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

final class AttributeMap {
final class AttributeMap implements Serializable {
private final AttributeMap parent;
private final Map<String, LDValue> map;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,10 @@ public String toJsonString() {
void write(JsonWriter writer) throws IOException {
writer.value(value);
}

// Preserve singleton identity after Java deserialization, since equals() for booleans
// relies on TRUE and FALSE being singletons.
private Object readResolve() {
return fromBoolean(value);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,9 @@ public String toJsonString() {
void write(JsonWriter writer) throws IOException {
writer.nullValue();
}

// Preserve singleton identity after Java deserialization.
private Object readResolve() {
return INSTANCE;
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package com.launchdarkly.sdk.json;

import java.io.Serializable;

/**
* Marker interface for SDK classes that have a custom JSON serialization.
*
* @see JsonSerialization
* @see LDGson
*/
public interface JsonSerializable {
public interface JsonSerializable extends Serializable {
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@

import org.junit.Test;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;

Expand Down Expand Up @@ -437,4 +441,40 @@ public void contextFromUserErrors() {
assertThat(c2.isValid(), is(false));
assertThat(c2.getError(), equalTo(Errors.CONTEXT_NO_KEY));
}

@Test
public void javaSerializationRoundTripSingleKind() throws Exception {
LDContext c = LDContext.builder(kind1, "my-key")
.name("my-name")
.anonymous(true)
.set("email", "x@example.com")
.set("happy", true)
.set("count", 3)
.set("tags", LDValue.buildArray().add("a").add("b").build())
.set("nested", LDValue.buildObject().put("inner", "v").build())
.privateAttributes("email")
.build();

assertThat(javaSerializeAndDeserialize(c), equalTo(c));
}

@Test
public void javaSerializationRoundTripMultiKind() throws Exception {
LDContext c = LDContext.createMulti(
LDContext.builder(kind1, "key1").set("a", "b").build(),
LDContext.builder(kind2, "key2").set("c", LDValue.buildArray().add(1).add(2).build()).build()
);

assertThat(javaSerializeAndDeserialize(c), equalTo(c));
}

private static LDContext javaSerializeAndDeserialize(LDContext c) throws Exception {
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
try (ObjectOutputStream out = new ObjectOutputStream(bytes)) {
out.writeObject(c);
}
try (ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bytes.toByteArray()))) {
return (LDContext) in.readObject();
}
}
}
Loading