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:
@@ -159,10 +159,11 @@ public class ObjectInputStream
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
var streamer :Streamer = (type is Class)
|
var jname :String = type as String;
|
||||||
? Streamer.getStreamerByClass(type as Class)
|
if (type is Class) {
|
||||||
: Streamer.getStreamerByJavaName(type as String);
|
jname = Translations.getToServer(ClassUtil.getClassName(type));
|
||||||
|
}
|
||||||
|
var streamer :Streamer = Streamer.getStreamerByJavaName(jname);
|
||||||
if (streamer == null) {
|
if (streamer == null) {
|
||||||
throw new Error("Cannot field stream " + type);
|
throw new Error("Cannot field stream " + type);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,39 +42,13 @@ public class Streamer
|
|||||||
{
|
{
|
||||||
public static function getStreamer (obj :Object) :Streamer
|
public static function getStreamer (obj :Object) :Streamer
|
||||||
{
|
{
|
||||||
|
var jname :String;
|
||||||
if (obj is TypedArray) {
|
if (obj is TypedArray) {
|
||||||
return getStreamerByJavaName(TypedArray(obj).getJavaType());
|
jname = TypedArray(obj).getJavaType();
|
||||||
} else {
|
} else {
|
||||||
return getStreamerByClass(ClassUtil.getClass(obj));
|
jname = Translations.getToServer(ClassUtil.getClassName(obj));
|
||||||
}
|
}
|
||||||
}
|
return getStreamerByJavaName(jname);
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function getStreamerByJavaName (jname :String) :Streamer
|
public static function getStreamerByJavaName (jname :String) :Streamer
|
||||||
@@ -97,6 +71,9 @@ public class Streamer
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
// otherwise see if it represents a Streamable
|
// 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));
|
var clazz :Class = ClassUtil.getClassByName(Translations.getFromServer(jname));
|
||||||
|
|
||||||
if (ClassUtil.isAssignableAs(Enum, clazz)) {
|
if (ClassUtil.isAssignableAs(Enum, clazz)) {
|
||||||
@@ -131,14 +108,6 @@ public class Streamer
|
|||||||
return _jname;
|
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
|
public function writeObject (obj :Object, out :ObjectOutputStream) :void
|
||||||
//throws IOError
|
//throws IOError
|
||||||
{
|
{
|
||||||
@@ -161,11 +130,6 @@ public class Streamer
|
|||||||
protected static function registerStreamer (st :Streamer) :void
|
protected static function registerStreamer (st :Streamer) :void
|
||||||
{
|
{
|
||||||
_byJName[st.getJavaClassName()] = st;
|
_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;
|
return;
|
||||||
}
|
}
|
||||||
_byJName = new Dictionary();
|
_byJName = new Dictionary();
|
||||||
_byClass = new Dictionary();
|
|
||||||
for each (var c :Class in
|
for each (var c :Class in
|
||||||
[ StringStreamer, NumberStreamer, ByteStreamer, IntegerStreamer, LongStreamer,
|
[ StringStreamer, NumberStreamer, ByteStreamer, IntegerStreamer, LongStreamer,
|
||||||
FloatStreamer, ArrayStreamer, ByteArrayStreamer ]) {
|
FloatStreamer, ArrayStreamer, ByteArrayStreamer ]) {
|
||||||
@@ -191,7 +154,6 @@ public class Streamer
|
|||||||
|
|
||||||
protected var _jname :String;
|
protected var _jname :String;
|
||||||
|
|
||||||
protected static var _byClass :Dictionary;
|
|
||||||
protected static var _byJName :Dictionary;
|
protected static var _byJName :Dictionary;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,11 +56,12 @@ public class Translations
|
|||||||
// initialize some standard classes
|
// initialize some standard classes
|
||||||
addTranslation("Object", "java.lang.Object");
|
addTranslation("Object", "java.lang.Object");
|
||||||
addTranslation("String", "java.lang.String");
|
addTranslation("String", "java.lang.String");
|
||||||
addTranslation("flash.utils.ByteArray", "[B");
|
|
||||||
addTranslation("com.threerings.util.langBoolean", "java.lang.Boolean");
|
addTranslation("com.threerings.util.langBoolean", "java.lang.Boolean");
|
||||||
addTranslation("com.threerings.util.Byte", "java.lang.Byte");
|
addTranslation("com.threerings.util.Byte", "java.lang.Byte");
|
||||||
addTranslation("com.threerings.util.Integer", "java.lang.Integer");
|
addTranslation("com.threerings.util.Integer", "java.lang.Integer");
|
||||||
addTranslation("com.threerings.util.Long", "java.lang.Long");
|
addTranslation("com.threerings.util.Long", "java.lang.Long");
|
||||||
addTranslation("com.threerings.util.Float", "java.lang.Float");
|
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
|
override public function createObject (ins :ObjectInputStream) :Object
|
||||||
{
|
{
|
||||||
var ta :TypedArray = new TypedArray(_jname);
|
var ta :TypedArray = new TypedArray(_jname);
|
||||||
|
|||||||
Reference in New Issue
Block a user