好的-
我自己找到了答案。这涉及编写我自己的AMF端点类和相关的序列化类。我要说的是,http://flexblog.faratasystems.com上的家伙一直是黑客BlazeDS灵感的重要来源。
该代码实际上应该合并到BlazeDS本身或某个开放源代码扩展项目中-它是如此基础。
频道定义
<channel-definition id="my-amf" > <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf" /> <properties> <serialization> <type-marshaller>ch.hedgesphere.core.blazeds.translator.HedgesphereASTranslator</type-marshaller> </serialization> </properties> </channel-definition>自定义AMF端点
package ch.hedgesphere.core.blazeds.endpoint;import ch.hedgesphere.core.blazeds.serialization.Serializer; public class AMFEndpoint extends flex.messaging.endpoints.AMFEndpoint { @Override protected String getSerializerClassName() { return Serializer.class.getName(); } }自定义序列化器
package ch.hedgesphere.core.blazeds.serialization;import java.io.OutputStream;import flex.messaging.io.MessageIOConstants;import flex.messaging.io.SerializationContext;import flex.messaging.io.amf.AmfMessageSerializer;import flex.messaging.io.amf.AmfTrace;public class Serializer extends AmfMessageSerializer { @Override public void initialize(SerializationContext context, OutputStream out, AmfTrace trace) { amfOut = new AMF0Output(context); amfOut.setOutputStream(out); amfOut.setAvmPlus(version >= MessageIOConstants.AMF3); debugTrace = trace; isDebug = trace != null; amfOut.setDebugTrace(debugTrace); }}自定义AMF 0处理
package ch.hedgesphere.core.blazeds.serialization;import flex.messaging.io.SerializationContext;public class AMF0Output extends flex.messaging.io.amf.Amf0Output {public AMF0Output(SerializationContext context) { super(context);}@Override protected void createAMF3Output() { avmPlusOutput = new AMF3Output(context); avmPlusOutput.setOutputStream(out); avmPlusOutput.setDebugTrace(trace); }}自定义AMF 3处理
package ch.hedgesphere.core.blazeds.serialization;import java.io.IOException;import org.joda.time.DateTime;import org.joda.time.LocalDate;import org.joda.time.LocalTime;import flex.messaging.io.SerializationContext;public class AMF3Output extends flex.messaging.io.amf.Amf3Output {public AMF3Output(SerializationContext context) { super(context);}@Overridepublic void writeObject(Object value) throws IOException { if(value instanceof DateTime) { value = convertToDate((DateTime)value); } if(value instanceof LocalDate) { value = convertToDate((LocalDate)value); } if(value instanceof LocalTime) { value = convertToDate((LocalTime)value); } super.writeObject(value);}private Object convertToDate(LocalTime time) { return time.toDateTimeToday().toDate();}private Object convertToDate(LocalDate date) { return date.toDateMidnight().toDate();}private Object convertToDate(DateTime dateTime) { return dateTime.toDate();} }用于Flex-> Java调用的自定义Marshaller
package ch.hedgesphere.core.blazeds.translator;import org.joda.time.DateTime;import org.joda.time.LocalDate;import org.joda.time.LocalTime;import flex.messaging.io.amf.translator.ASTranslator;public class HedgesphereASTranslator extends ASTranslator {@SuppressWarnings({"rawtypes"})@Overridepublic Object convert(Object originalValue, Class type) { if( type.equals(DateTime.class)) { return convertToDateTime(originalValue); } if( type.equals(LocalDate.class)) { return convertToLocalDate(originalValue); } if( type.equals(LocalTime.class)) { return convertToLocalTime(originalValue); } return super.convert(originalValue, type);}private Object convertToLocalTime(Object originalValue) { return originalValue == null ? null : new LocalTime(originalValue);}private Object convertToLocalDate(Object originalValue) { return originalValue == null ? null : new LocalDate(originalValue); }private Object convertToDateTime(Object originalValue) { return originalValue == null ? null : new DateTime(originalValue);}@SuppressWarnings({"rawtypes"})@Overridepublic Object createInstance(Object source, Class type) { return super.createInstance(source, type);}}


