Skip to content

Commit

Permalink
Enabled Java Serialization for nearly all data structures - fixes 281
Browse files Browse the repository at this point in the history
Signed-off-by: Stuart Halloway <stu@thinkrelevance.com>
  • Loading branch information
cemerick authored and stuarthalloway committed May 4, 2010
1 parent 58fee96 commit 68a14c8
Show file tree
Hide file tree
Showing 20 changed files with 223 additions and 23 deletions.
4 changes: 1 addition & 3 deletions src/jvm/clojure/lang/AFn.java
Expand Up @@ -12,9 +12,7 @@

package clojure.lang;

import java.io.Serializable;

public abstract class AFn implements IFn, Serializable{
public abstract class AFn implements IFn {

public Object call() throws Exception{
return invoke();
Expand Down
3 changes: 2 additions & 1 deletion src/jvm/clojure/lang/AFunction.java
Expand Up @@ -12,9 +12,10 @@

package clojure.lang;

import java.io.Serializable;
import java.util.Comparator;

public abstract class AFunction extends AFn implements IObj, Comparator, Fn{
public abstract class AFunction extends AFn implements IObj, Comparator, Fn, Serializable {

public volatile MethodImplCache __methodImplCache;

Expand Down
3 changes: 2 additions & 1 deletion src/jvm/clojure/lang/APersistentMap.java
Expand Up @@ -10,9 +10,10 @@

package clojure.lang;

import java.io.Serializable;
import java.util.*;

public abstract class APersistentMap extends AFn implements IPersistentMap, Map, Iterable{
public abstract class APersistentMap extends AFn implements IPersistentMap, Map, Iterable, Serializable {
int _hash = -1;

public String toString(){
Expand Down
3 changes: 2 additions & 1 deletion src/jvm/clojure/lang/APersistentSet.java
Expand Up @@ -12,11 +12,12 @@

package clojure.lang;

import java.io.Serializable;
import java.util.Collection;
import java.util.Iterator;
import java.util.Set;

public abstract class APersistentSet extends AFn implements IPersistentSet, Collection, Set{
public abstract class APersistentSet extends AFn implements IPersistentSet, Collection, Set, Serializable {
int _hash = -1;
final IPersistentMap impl;

Expand Down
4 changes: 3 additions & 1 deletion src/jvm/clojure/lang/APersistentVector.java
Expand Up @@ -12,11 +12,13 @@

package clojure.lang;

import java.io.Serializable;
import java.util.*;

public abstract class APersistentVector extends AFn implements IPersistentVector, Iterable,
List,
RandomAccess, Comparable{
RandomAccess, Comparable,
Serializable {
int _hash = -1;

public String toString(){
Expand Down
3 changes: 2 additions & 1 deletion src/jvm/clojure/lang/ASeq.java
Expand Up @@ -10,9 +10,10 @@

package clojure.lang;

import java.io.Serializable;
import java.util.*;

public abstract class ASeq extends Obj implements ISeq, List{
public abstract class ASeq extends Obj implements ISeq, List, Serializable {
transient int _hash = -1;

public String toString(){
Expand Down
4 changes: 3 additions & 1 deletion src/jvm/clojure/lang/ArrayChunk.java
Expand Up @@ -12,7 +12,9 @@

package clojure.lang;

public final class ArrayChunk implements IChunk{
import java.io.Serializable;

public final class ArrayChunk implements IChunk, Serializable {

final Object[] array;
final int off;
Expand Down
4 changes: 3 additions & 1 deletion src/jvm/clojure/lang/Cons.java
Expand Up @@ -12,7 +12,9 @@

package clojure.lang;

final public class Cons extends ASeq{
import java.io.Serializable;

final public class Cons extends ASeq implements Serializable {

private final Object _first;
private final ISeq _more;
Expand Down
7 changes: 7 additions & 0 deletions src/jvm/clojure/lang/EnumerationSeq.java
Expand Up @@ -12,6 +12,8 @@

package clojure.lang;

import java.io.IOException;
import java.io.NotSerializableException;
import java.util.Enumeration;

public class EnumerationSeq extends ASeq{
Expand Down Expand Up @@ -68,4 +70,9 @@ public ISeq next(){
public EnumerationSeq withMeta(IPersistentMap meta){
return new EnumerationSeq(meta, iter, state);
}

private void writeObject (java.io.ObjectOutputStream out) throws IOException {
throw new NotSerializableException(getClass().getName());
}

}
6 changes: 6 additions & 0 deletions src/jvm/clojure/lang/IteratorSeq.java
Expand Up @@ -10,6 +10,8 @@

package clojure.lang;

import java.io.IOException;
import java.io.NotSerializableException;
import java.util.Iterator;

public class IteratorSeq extends ASeq{
Expand Down Expand Up @@ -66,4 +68,8 @@ public ISeq next(){
public IteratorSeq withMeta(IPersistentMap meta){
return new IteratorSeq(meta, iter, state);
}

private void writeObject (java.io.ObjectOutputStream out) throws IOException {
throw new NotSerializableException(getClass().getName());
}
}
14 changes: 11 additions & 3 deletions src/jvm/clojure/lang/Namespace.java
Expand Up @@ -12,13 +12,15 @@

package clojure.lang;

import java.io.ObjectStreamException;
import java.io.Serializable;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicReference;

public class Namespace extends AReference{
public class Namespace extends AReference implements Serializable {
final public Symbol name;
final AtomicReference<IPersistentMap> mappings = new AtomicReference<IPersistentMap>();
final AtomicReference<IPersistentMap> aliases = new AtomicReference<IPersistentMap>();
transient final AtomicReference<IPersistentMap> mappings = new AtomicReference<IPersistentMap>();
transient final AtomicReference<IPersistentMap> aliases = new AtomicReference<IPersistentMap>();

final static ConcurrentHashMap<Symbol, Namespace> namespaces = new ConcurrentHashMap<Symbol, Namespace>();

Expand Down Expand Up @@ -204,4 +206,10 @@ public void removeAlias(Symbol alias) throws Exception{
map = getAliases();
}
}

private Object readResolve() throws ObjectStreamException {
// ensures that serialized namespaces are "deserialized" to the
// namespace in the present runtime
return findOrCreate(name);
}
}
4 changes: 3 additions & 1 deletion src/jvm/clojure/lang/Obj.java
Expand Up @@ -12,7 +12,9 @@

package clojure.lang;

public abstract class Obj implements IObj{
import java.io.Serializable;

public abstract class Obj implements IObj, Serializable {

final IPersistentMap _meta;

Expand Down
1 change: 1 addition & 0 deletions src/jvm/clojure/lang/PersistentArrayMap.java
Expand Up @@ -10,6 +10,7 @@

package clojure.lang;

import java.io.Serializable;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Map;
Expand Down
3 changes: 2 additions & 1 deletion src/jvm/clojure/lang/PersistentHashMap.java
Expand Up @@ -10,6 +10,7 @@

package clojure.lang;

import java.io.Serializable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -292,7 +293,7 @@ void ensureEditable(){
}
}

static interface INode{
static interface INode extends Serializable {
INode assoc(int shift, int hash, Object key, Object val, Box addedLeaf);

INode without(int shift, int hash, Object key);
Expand Down
3 changes: 2 additions & 1 deletion src/jvm/clojure/lang/PersistentList.java
Expand Up @@ -10,9 +10,10 @@

package clojure.lang;

import java.io.Serializable;
import java.util.*;

public class PersistentList extends ASeq implements IPersistentList, IReduce, List, Counted{
public class PersistentList extends ASeq implements IPersistentList, IReduce, List, Counted {

private final Object _first;
private final IPersistentList _rest;
Expand Down
5 changes: 3 additions & 2 deletions src/jvm/clojure/lang/PersistentVector.java
Expand Up @@ -12,13 +12,14 @@

package clojure.lang;

import java.io.Serializable;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;

public class PersistentVector extends APersistentVector implements IObj, IEditableCollection{

static class Node{
final AtomicReference<Thread> edit;
static class Node implements Serializable {
transient final AtomicReference<Thread> edit;
final Object[] array;

Node(AtomicReference<Thread> edit, Object[] array){
Expand Down
14 changes: 11 additions & 3 deletions src/jvm/clojure/lang/RT.java
Expand Up @@ -238,11 +238,19 @@ public static List<String> processCommandLine(String[] args){
}

static public final Object[] EMPTY_ARRAY = new Object[]{};
static public final Comparator DEFAULT_COMPARATOR = new Comparator(){
public int compare(Object o1, Object o2){
static public final Comparator DEFAULT_COMPARATOR = new DefaultComparator();

private static final class DefaultComparator implements Comparator, Serializable {
public int compare(Object o1, Object o2){
return Util.compare(o1, o2);
}
};

private Object readResolve() throws ObjectStreamException {
// ensures that we aren't hanging onto a new default comparator for every
// sorted set, etc., we deserialize
return DEFAULT_COMPARATOR;
}
}

static AtomicInteger id = new AtomicInteger(1);

Expand Down
2 changes: 0 additions & 2 deletions src/jvm/clojure/lang/Range.java
Expand Up @@ -12,8 +12,6 @@

package clojure.lang;

import java.util.concurrent.atomic.AtomicInteger;

public class Range extends ASeq implements IReduce, Counted{
final int end;
final int n;
Expand Down
1 change: 1 addition & 0 deletions test/clojure/test_clojure.clj
Expand Up @@ -54,6 +54,7 @@
:vectors
:annotations
:pprint
:serialization
])

(def test-namespaces
Expand Down

0 comments on commit 68a14c8

Please sign in to comment.