diff --git a/src/java/com/threerings/io/BasicStreamers.java b/src/java/com/threerings/io/BasicStreamers.java index d4937e780..270948878 100644 --- a/src/java/com/threerings/io/BasicStreamers.java +++ b/src/java/com/threerings/io/BasicStreamers.java @@ -23,12 +23,14 @@ package com.threerings.io; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.RandomAccess; import java.io.EOFException; import java.io.IOException; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; /** * Code to read and write basic object types (like arrays of primitives, {@link Integer} instances, @@ -36,55 +38,30 @@ import com.google.common.collect.Lists; */ public class BasicStreamers { - /** An array of types for all of the basic streamers. */ - public static Class[] BSTREAMER_TYPES = { - Boolean.class, - Byte.class, - Short.class, - Character.class, - Integer.class, - Long.class, - Float.class, - Double.class, - Class.class, - String.class, - boolean[].class, - byte[].class, - short[].class, - char[].class, - int[].class, - long[].class, - float[].class, - double[].class, - Object[].class, - List.class, - ArrayList.class, - }; - - /** An array of instances of all of the basic streamers. */ - public static Streamer[] BSTREAMER_INSTANCES = { - new BooleanStreamer(), - new ByteStreamer(), - new ShortStreamer(), - new CharacterStreamer(), - new IntegerStreamer(), - new LongStreamer(), - new FloatStreamer(), - new DoubleStreamer(), - new ClassStreamer(), - new StringStreamer(), - new BooleanArrayStreamer(), - new ByteArrayStreamer(), - new ShortArrayStreamer(), - new CharArrayStreamer(), - new IntArrayStreamer(), - new LongArrayStreamer(), - new FloatArrayStreamer(), - new DoubleArrayStreamer(), - new ObjectArrayStreamer(), - new ListStreamer(), - new ListStreamer(),// Second ListStreamer lines up with ArrayList above - }; + public static Map, Streamer> BSTREAMERS = Maps.newLinkedHashMap(); + static { + BSTREAMERS.put(Boolean.class, new BooleanStreamer()); + BSTREAMERS.put(Byte.class, new ByteStreamer()); + BSTREAMERS.put(Short.class, new ShortStreamer()); + BSTREAMERS.put(Character.class, new CharacterStreamer()); + BSTREAMERS.put(Integer.class, new IntegerStreamer()); + BSTREAMERS.put(Long.class, new LongStreamer()); + BSTREAMERS.put(Float.class, new FloatStreamer()); + BSTREAMERS.put(Double.class, new DoubleStreamer()); + BSTREAMERS.put(Class.class, new ClassStreamer()); + BSTREAMERS.put(String.class, new StringStreamer()); + BSTREAMERS.put(boolean[].class, new BooleanArrayStreamer()); + BSTREAMERS.put(byte[].class, new ByteArrayStreamer()); + BSTREAMERS.put(short[].class, new ShortArrayStreamer()); + BSTREAMERS.put(char[].class, new CharArrayStreamer()); + BSTREAMERS.put(int[].class, new IntArrayStreamer()); + BSTREAMERS.put(long[].class, new LongArrayStreamer()); + BSTREAMERS.put(float[].class, new FloatArrayStreamer()); + BSTREAMERS.put(double[].class, new DoubleArrayStreamer()); + BSTREAMERS.put(Object[].class, new ObjectArrayStreamer()); + BSTREAMERS.put(List.class, new ListStreamer()); + BSTREAMERS.put(ArrayList.class, new ListStreamer()); + } /** Streams {@link Boolean} instances. */ public static class BooleanStreamer extends BasicStreamer diff --git a/src/java/com/threerings/io/FieldMarshaller.java b/src/java/com/threerings/io/FieldMarshaller.java index 3456d867d..e185ba878 100644 --- a/src/java/com/threerings/io/FieldMarshaller.java +++ b/src/java/com/threerings/io/FieldMarshaller.java @@ -27,6 +27,7 @@ import java.lang.reflect.ReflectPermission; import java.util.Date; import java.util.HashMap; +import java.util.Map; import com.google.common.collect.Maps; @@ -126,6 +127,11 @@ public abstract class FieldMarshaller fm = _marshallers.get(Streamable.class); } + // sanity check + if (fm == null) { + throw new AssertionError("Requested to marshal unsupported field " + field); + } + return fm; } @@ -378,10 +384,8 @@ public abstract class FieldMarshaller }); // create field marshallers for all of the basic types - int bscount = BasicStreamers.BSTREAMER_TYPES.length; - for (int ii = 0; ii < bscount; ii++) { - _marshallers.put(BasicStreamers.BSTREAMER_TYPES[ii], - new StreamerMarshaller(BasicStreamers.BSTREAMER_INSTANCES[ii])); + for (Map.Entry,Streamer> entry : BasicStreamers.BSTREAMERS.entrySet()) { + _marshallers.put(entry.getKey(), new StreamerMarshaller(entry.getValue())); } // create the field marshaller for pooled strings diff --git a/src/java/com/threerings/io/Streamer.java b/src/java/com/threerings/io/Streamer.java index 99ea84273..6632b0e92 100644 --- a/src/java/com/threerings/io/Streamer.java +++ b/src/java/com/threerings/io/Streamer.java @@ -495,10 +495,8 @@ public class Streamer _streamers = Maps.newHashMap(); // register all of the basic streamers - int bscount = BasicStreamers.BSTREAMER_TYPES.length; - for (int ii = 0; ii < bscount; ii++) { - _streamers.put(BasicStreamers.BSTREAMER_TYPES[ii], - BasicStreamers.BSTREAMER_INSTANCES[ii]); + for (Map.Entry,Streamer> entry : BasicStreamers.BSTREAMERS.entrySet()) { + _streamers.put(entry.getKey(), entry.getValue()); } }