Further cleanup: always look up streamers by their java name.

- Sliiiiightly less efficient in a few cases.
- But: looking typed arrays up by class didn't work anyway,
  there was some duplicated code in jname and class lookup,
  and the jname thing handles Lists from the server. So
  overall I think this is a win.
Less code is better code.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@5610 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
Ray Greenwell
2008-12-31 00:41:20 +00:00
parent e9152193b7
commit 7728ed9bd3
4 changed files with 14 additions and 57 deletions
@@ -159,10 +159,11 @@ public class ObjectInputStream
return null;
}
var streamer :Streamer = (type is Class)
? Streamer.getStreamerByClass(type as Class)
: Streamer.getStreamerByJavaName(type as String);
var jname :String = type as String;
if (type is Class) {
jname = Translations.getToServer(ClassUtil.getClassName(type));
}
var streamer :Streamer = Streamer.getStreamerByJavaName(jname);
if (streamer == null) {
throw new Error("Cannot field stream " + type);
}
+7 -45
View File
@@ -42,39 +42,13 @@ public class Streamer
{
public static function getStreamer (obj :Object) :Streamer
{
var jname :String;
if (obj is TypedArray) {
return getStreamerByJavaName(TypedArray(obj).getJavaType());
jname = TypedArray(obj).getJavaType();
} else {
return getStreamerByClass(ClassUtil.getClass(obj));
jname = Translations.getToServer(ClassUtil.getClassName(obj));
}
}
public static function getStreamerByClass (clazz :Class) :Streamer
{
initStreamers();
if (clazz === TypedArray) {
throw new Error("Broken, TODO");
}
var streamer :Streamer = _byClass[clazz] as Streamer;
if (streamer != null) {
return streamer;
}
if (ClassUtil.isAssignableAs(Enum, clazz)) {
streamer = new EnumStreamer(clazz);
} else if (ClassUtil.isAssignableAs(Streamable, clazz)) {
streamer = new Streamer(clazz);
} else {
return null;
}
// add the new streamer and return it
registerStreamer(streamer);
return streamer;
return getStreamerByJavaName(jname);
}
public static function getStreamerByJavaName (jname :String) :Streamer
@@ -97,6 +71,9 @@ public class Streamer
} else {
// otherwise see if it represents a Streamable
// usually this is called from ObjectInputStream, but when it's called from
// ObjectOutputStream it's a bit annoying, because we started with a class/object.
// But: the code is smaller, so that wins
var clazz :Class = ClassUtil.getClassByName(Translations.getFromServer(jname));
if (ClassUtil.isAssignableAs(Enum, clazz)) {
@@ -131,14 +108,6 @@ public class Streamer
return _jname;
}
/**
* Return the Class identifying that which we stream, or null to not be registered.
*/
public function getClass () :Class
{
return _target;
}
public function writeObject (obj :Object, out :ObjectOutputStream) :void
//throws IOError
{
@@ -161,11 +130,6 @@ public class Streamer
protected static function registerStreamer (st :Streamer) :void
{
_byJName[st.getJavaClassName()] = st;
trace(": registered " + st.getJavaClassName());
var c :Class = st.getClass();
if (c != null) {
_byClass[c] = st;
}
}
/**
@@ -179,7 +143,6 @@ public class Streamer
return;
}
_byJName = new Dictionary();
_byClass = new Dictionary();
for each (var c :Class in
[ StringStreamer, NumberStreamer, ByteStreamer, IntegerStreamer, LongStreamer,
FloatStreamer, ArrayStreamer, ByteArrayStreamer ]) {
@@ -191,7 +154,6 @@ public class Streamer
protected var _jname :String;
protected static var _byClass :Dictionary;
protected static var _byJName :Dictionary;
}
}
+2 -1
View File
@@ -56,11 +56,12 @@ public class Translations
// initialize some standard classes
addTranslation("Object", "java.lang.Object");
addTranslation("String", "java.lang.String");
addTranslation("flash.utils.ByteArray", "[B");
addTranslation("com.threerings.util.langBoolean", "java.lang.Boolean");
addTranslation("com.threerings.util.Byte", "java.lang.Byte");
addTranslation("com.threerings.util.Integer", "java.lang.Integer");
addTranslation("com.threerings.util.Long", "java.lang.Long");
addTranslation("com.threerings.util.Float", "java.lang.Float");
addTranslation("Array", "[Ljava.lang.Object;");
addTranslation("flash.utils.ByteArray", "[B");
}
}
@@ -66,13 +66,6 @@ public class ArrayStreamer extends Streamer
}
}
override public function getClass () :Class
{
// this is a little weird, but basically, we don't want to be registered for Array
// unless we're the basic Object array streamer.
return (_jname == "[Ljava.lang.Object;") ? Array : null;
}
override public function createObject (ins :ObjectInputStream) :Object
{
var ta :TypedArray = new TypedArray(_jname);