Added ability to marshall Streamable instances.
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@380 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// $Id: ValueMarshaller.java,v 1.3 2001/09/17 05:18:21 mdb Exp $
|
// $Id: ValueMarshaller.java,v 1.4 2001/10/03 03:38:55 mdb Exp $
|
||||||
|
|
||||||
package com.threerings.cocktail.cher.dobj.io;
|
package com.threerings.cocktail.cher.dobj.io;
|
||||||
|
|
||||||
@@ -7,6 +7,7 @@ import java.io.*;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
|
||||||
import com.samskivert.util.HashIntMap;
|
import com.samskivert.util.HashIntMap;
|
||||||
|
import com.threerings.cocktail.cher.io.Streamable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The value marshaller provides a mechanism for marshalling and
|
* The value marshaller provides a mechanism for marshalling and
|
||||||
@@ -42,7 +43,14 @@ public class ValueMarshaller
|
|||||||
public static void writeTo (DataOutputStream out, Object value)
|
public static void writeTo (DataOutputStream out, Object value)
|
||||||
throws IOException
|
throws IOException
|
||||||
{
|
{
|
||||||
Marshaller marsh = (Marshaller)_outmap.get(value.getClass());
|
// all types except streamable have a one to one mapping from
|
||||||
|
// class object to marshaller, but streamables have to be looked
|
||||||
|
// up specially because we are dealing with a interface
|
||||||
|
// implementation of streamable rather than a direct instance
|
||||||
|
Class vclass = (value instanceof Streamable) ?
|
||||||
|
Streamable.class : value.getClass();
|
||||||
|
|
||||||
|
Marshaller marsh = (Marshaller)_outmap.get(vclass);
|
||||||
if (marsh == null) {
|
if (marsh == null) {
|
||||||
throw new RuntimeException("Requested to serialize invalid " +
|
throw new RuntimeException("Requested to serialize invalid " +
|
||||||
"type [value=" + value + ", type=" +
|
"type [value=" + value + ", type=" +
|
||||||
@@ -482,6 +490,37 @@ public class ValueMarshaller
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected static class StreamableMarshaller extends Marshaller
|
||||||
|
{
|
||||||
|
public StreamableMarshaller ()
|
||||||
|
{
|
||||||
|
super((byte)15);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void writeValue (DataOutputStream out, Object value)
|
||||||
|
throws IOException
|
||||||
|
{
|
||||||
|
out.writeUTF(value.getClass().getName());
|
||||||
|
((Streamable)value).writeTo(out);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object readValue (DataInputStream in)
|
||||||
|
throws IOException
|
||||||
|
{
|
||||||
|
String cname = in.readUTF();
|
||||||
|
try {
|
||||||
|
Streamable value = (Streamable)
|
||||||
|
Class.forName(cname).newInstance();
|
||||||
|
value.readFrom(in);
|
||||||
|
return value;
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new IOException("Unable to unmarshall streamable " +
|
||||||
|
"[cname=" + cname +
|
||||||
|
", error=" + e + "]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected static HashMap _outmap = new HashMap();
|
protected static HashMap _outmap = new HashMap();
|
||||||
protected static HashIntMap _inmap = new HashIntMap();
|
protected static HashIntMap _inmap = new HashIntMap();
|
||||||
|
|
||||||
@@ -499,7 +538,8 @@ public class ValueMarshaller
|
|||||||
(new long[0]).getClass(),
|
(new long[0]).getClass(),
|
||||||
(new float[0]).getClass(),
|
(new float[0]).getClass(),
|
||||||
(new double[0]).getClass(),
|
(new double[0]).getClass(),
|
||||||
(new String[0]).getClass()
|
(new String[0]).getClass(),
|
||||||
|
Streamable.class
|
||||||
};
|
};
|
||||||
|
|
||||||
protected static Marshaller[] _marshallers = {
|
protected static Marshaller[] _marshallers = {
|
||||||
@@ -516,7 +556,8 @@ public class ValueMarshaller
|
|||||||
new LongArrayMarshaller(),
|
new LongArrayMarshaller(),
|
||||||
new FloatArrayMarshaller(),
|
new FloatArrayMarshaller(),
|
||||||
new DoubleArrayMarshaller(),
|
new DoubleArrayMarshaller(),
|
||||||
new StringArrayMarshaller()
|
new StringArrayMarshaller(),
|
||||||
|
new StreamableMarshaller()
|
||||||
};
|
};
|
||||||
|
|
||||||
// register our marshallers
|
// register our marshallers
|
||||||
|
|||||||
Reference in New Issue
Block a user