diff --git a/src/java/com/threerings/io/ObjectOutputStream.java b/src/java/com/threerings/io/ObjectOutputStream.java index 6ebd8d781..25e26426c 100644 --- a/src/java/com/threerings/io/ObjectOutputStream.java +++ b/src/java/com/threerings/io/ObjectOutputStream.java @@ -93,14 +93,16 @@ public class ObjectOutputStream extends DataOutputStream _classmap = new HashMap(); } - // otherwise, look up the class mapping record - Class sclass = object.getClass(); + // otherwise, look up the class mapping record (if the target class is + // an enum, convert it from its potentially enum-value specific class + // to the main class for that enum) + Class sclass = Streamer.getStreamerClass(object); ClassMapping cmap = _classmap.get(sclass); // create a class mapping for this class if we've not got one if (cmap == null) { // create a streamer instance and assign a code to this class - Streamer streamer = Streamer.getStreamer(sclass); + Streamer streamer = Streamer.getStreamer(object); // we specifically do not inline the getStreamer() call // into the ClassMapping constructor because we want to be // sure not to call _nextCode++ if getStreamer() throws an @@ -146,7 +148,7 @@ public class ObjectOutputStream extends DataOutputStream public void writeBareObject (Object object) throws IOException { - writeBareObject(object, Streamer.getStreamer(object.getClass()), true); + writeBareObject(object, Streamer.getStreamer(object), true); } /** diff --git a/src/java/com/threerings/io/Streamer.java b/src/java/com/threerings/io/Streamer.java index de8dc8b2a..97b175b18 100644 --- a/src/java/com/threerings/io/Streamer.java +++ b/src/java/com/threerings/io/Streamer.java @@ -80,6 +80,18 @@ public class Streamer } } + /** + * Returns the class that should be used when streaming this object. In + * general that is the object's natural class, but for enum values, that + * might be its declaring class as enums use classes in a way that would + * otherwise pollute our id to class mapping space. + */ + public static Class getStreamerClass (Object object) + { + return (object instanceof Enum) ? + ((Enum)object).getDeclaringClass() : object.getClass(); + } + /** * Obtains a {@link Streamer} that can be used to read and write * objects of the specified target class. {@link Streamer} instances @@ -90,7 +102,7 @@ public class Streamer * does not implement {@link Streamable} and is not one of the basic * object types (@see {@link ObjectOutputStream}). */ - public synchronized static Streamer getStreamer (Class target) + public synchronized static Streamer getStreamer (Object object) throws IOException { // if we have not yet initialized ourselves, do so now @@ -98,12 +110,7 @@ public class Streamer createStreamers(); } - // if the target class is an enum, convert it from its potentially - // enum-value specific class to the main class for that enum - if (target.isEnum()) { - target = target.getDeclaringClass(); - } - + Class target = getStreamerClass(object); Streamer stream = _streamers.get(target); if (stream == null) { // make sure this is a streamable class