At Ray's suggestion, go ahead and throw an error when the wrong type is read. Use the Type(obj) cast syntax (I was unaware that this would actually throw an error). Reading objects of a basic type like Array must still use "readObject(Array) as Array" so this is still supported, though not needed for user types.

git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@5441 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
Jamie Doornbos
2008-10-13 17:34:55 +00:00
parent 2b298aa3d5
commit 077c5e8053
17 changed files with 25 additions and 25 deletions
@@ -78,7 +78,7 @@ public class UserMessage extends ChatMessage
override public function readObject (ins :ObjectInputStream) :void override public function readObject (ins :ObjectInputStream) :void
{ {
super.readObject(ins); super.readObject(ins);
speaker = (ins.readObject(Name) as Name); speaker = Name(ins.readObject());
mode = ins.readByte(); mode = ins.readByte();
} }
@@ -51,7 +51,7 @@ public class UserSystemMessage extends SystemMessage
override public function readObject (ins :ObjectInputStream) :void override public function readObject (ins :ObjectInputStream) :void
{ {
super.readObject(ins); super.readObject(ins);
speaker = (ins.readObject(Name) as Name); speaker = Name(ins.readObject());
} }
// from interface Streamable // from interface Streamable
@@ -180,7 +180,7 @@ public class BodyObject extends ClientObject
override public function readObject (ins :ObjectInputStream) :void override public function readObject (ins :ObjectInputStream) :void
{ {
super.readObject(ins); super.readObject(ins);
location = (ins.readObject(Place) as Place); location = Place(ins.readObject());
status = ins.readByte(); status = ins.readByte();
awayMessage = (ins.readField(String) as String); awayMessage = (ins.readField(String) as String);
} }
@@ -118,7 +118,7 @@ public class OccupantInfo extends SimpleStreamableObject
{ {
super.readObject(ins); super.readObject(ins);
bodyOid = (ins.readField(Integer) as Integer).value; bodyOid = (ins.readField(Integer) as Integer).value;
username = (ins.readObject(Name) as Name); username = Name(ins.readObject());
status = ins.readByte(); status = ins.readByte();
} }
@@ -206,9 +206,9 @@ public class PlaceObject extends DObject
override public function readObject (ins :ObjectInputStream) :void override public function readObject (ins :ObjectInputStream) :void
{ {
super.readObject(ins); super.readObject(ins);
occupants = (ins.readObject(OidList) as OidList); occupants = OidList(ins.readObject());
occupantInfo = (ins.readObject(DSet) as DSet); occupantInfo = DSet(ins.readObject());
speakService = (ins.readObject(SpeakMarshaller) as SpeakMarshaller); speakService = SpeakMarshaller(ins.readObject());
} }
} }
} }
@@ -51,7 +51,7 @@ public class CrowdClientInfo extends ClientInfo
override public function readObject (ins :ObjectInputStream) :void override public function readObject (ins :ObjectInputStream) :void
{ {
super.readObject(ins); super.readObject(ins);
visibleName = (ins.readObject(Name) as Name); visibleName = Name(ins.readObject());
} }
// from interface Streamable // from interface Streamable
@@ -56,10 +56,10 @@ public class ObjectInputStream
/** /**
* Attempts to read the next object from the stream. If a type is passed and the read object's * Attempts to read the next object from the stream. If a type is passed and the read object's
* type doesn't match, a warning is printed and null returned. The method does not throw, * type doesn't match, a <code>TypeError</code> is thrown.
* presumably to allow the client to hobble along until second order symptoms are observed.
* @param type optional type to check the read object against * @param type optional type to check the read object against
* @return null if the object could not be read or is of the wrong type * @throws TypeError if the object is read successfully but is the wrong type
* @return null if the object could not be read (or is actually null)
*/ */
public function readObject (type :Class = null) :Object public function readObject (type :Class = null) :Object
//throws IOError //throws IOError
@@ -115,8 +115,8 @@ public class ObjectInputStream
readBareObjectImpl(target, cmap.streamer); readBareObjectImpl(target, cmap.streamer);
if (DEBUG) log.debug(DEBUG_ID + "Read object: " + target); if (DEBUG) log.debug(DEBUG_ID + "Read object: " + target);
if (type != null && !(target is type)) { if (type != null && !(target is type)) {
log.warning("Type mismatch", "expected", type, "read", ClassUtil.getClass(target)); throw new TypeError(
return null; "Cannot convert " + ClassUtil.getClass(target) + " to " + type);
} }
return target; return target;
@@ -108,9 +108,9 @@ public class ClientObject extends DObject
override public function readObject (ins :ObjectInputStream) :void override public function readObject (ins :ObjectInputStream) :void
{ {
super.readObject(ins); super.readObject(ins);
username = (ins.readObject(Name) as Name); username = Name(ins.readObject());
receivers = (ins.readObject(DSet) as DSet); receivers = DSet(ins.readObject());
_permPolicy = (ins.readObject(PermissionPolicy) as PermissionPolicy); _permPolicy = PermissionPolicy(ins.readObject());
} }
protected var _permPolicy :PermissionPolicy; protected var _permPolicy :PermissionPolicy;
@@ -112,7 +112,7 @@ public class CompoundEvent extends DEvent
override public function readObject (ins :ObjectInputStream) :void override public function readObject (ins :ObjectInputStream) :void
{ {
super.readObject(ins); super.readObject(ins);
_events = (ins.readObject(StreamableArrayList) as StreamableArrayList); _events = StreamableArrayList(ins.readObject());
} }
/** A list of the events associated with this compound event. */ /** A list of the events associated with this compound event. */
@@ -104,7 +104,7 @@ public class EntryAddedEvent extends NamedEvent
override public function readObject (ins :ObjectInputStream) :void override public function readObject (ins :ObjectInputStream) :void
{ {
super.readObject(ins); super.readObject(ins);
_entry = (ins.readObject(DSet_Entry) as DSet_Entry); _entry = DSet_Entry(ins.readObject());
} }
protected var _entry :DSet_Entry; protected var _entry :DSet_Entry;
@@ -122,7 +122,7 @@ public class EntryUpdatedEvent extends NamedEvent
override public function readObject (ins :ObjectInputStream) :void override public function readObject (ins :ObjectInputStream) :void
{ {
super.readObject(ins); super.readObject(ins);
_entry = (ins.readObject(DSet_Entry) as DSet_Entry); _entry = DSet_Entry(ins.readObject());
} }
protected var _entry :DSet_Entry; protected var _entry :DSet_Entry;
@@ -34,7 +34,7 @@ public class AuthResponse extends DownstreamMessage
override public function readObject (ins :ObjectInputStream) :void override public function readObject (ins :ObjectInputStream) :void
{ {
super.readObject(ins); super.readObject(ins);
_data = (ins.readObject(AuthResponseData) as AuthResponseData); _data = AuthResponseData(ins.readObject());
} }
protected var _data :AuthResponseData; protected var _data :AuthResponseData;
@@ -33,7 +33,7 @@ public class BootstrapNotification extends DownstreamMessage
override public function readObject (ins :ObjectInputStream) :void override public function readObject (ins :ObjectInputStream) :void
{ {
super.readObject(ins); super.readObject(ins);
_data = (ins.readObject(BootstrapData) as BootstrapData); _data = BootstrapData(ins.readObject());
} }
/** The data associated with this notification. */ /** The data associated with this notification. */
@@ -57,7 +57,7 @@ public /* abstract */ class Credentials
public function readObject (ins :ObjectInputStream) :void public function readObject (ins :ObjectInputStream) :void
//throws IOError //throws IOError
{ {
_username = (ins.readObject(Name) as Name); _username = Name(ins.readObject());
} }
public function toString () :String public function toString () :String
@@ -40,7 +40,7 @@ public class EventNotification extends DownstreamMessage
override public function readObject (ins :ObjectInputStream) :void override public function readObject (ins :ObjectInputStream) :void
{ {
super.readObject(ins); super.readObject(ins);
_event = (ins.readObject(DEvent) as DEvent); _event = DEvent(ins.readObject());
} }
/** The event which we are forwarding. */ /** The event which we are forwarding. */
@@ -40,7 +40,7 @@ public class ObjectResponse extends DownstreamMessage
override public function readObject (ins :ObjectInputStream) :void override public function readObject (ins :ObjectInputStream) :void
{ {
super.readObject(ins); super.readObject(ins);
_dobj = (ins.readObject(DObject) as DObject); _dobj = DObject(ins.readObject());
} }
/** The object which is associated with this response. */ /** The object which is associated with this response. */
@@ -53,7 +53,7 @@ public class ClientInfo extends SimpleStreamableObject
override public function readObject (ins :ObjectInputStream) :void override public function readObject (ins :ObjectInputStream) :void
{ {
super.readObject(ins); super.readObject(ins);
username = (ins.readObject(Name) as Name); username = Name(ins.readObject());
} }
// from interface Streamable // from interface Streamable