代码之家  ›  专栏  ›  技术社区  ›  SteveD

通过BlazeDS从Java到Flex的定制编组

  •  6
  • SteveD  · 技术社区  · 14 年前

    我们做了很多数据计算,所以我们在整个代码和域模型中广泛使用Joda Time。

    我们的目标是使用Actionscript 3数据类型 Date 在Flex方面,让我们使用Joda time的地图 DateTime , LocalDate LocalTime Java端的类型。

    我们可以解决ActionScript3的转换问题 日期 使用插入BlazeDS中的自定义类型封送拆收器调用Java时键入,但这似乎只为Flex->Java/BlazeDS方向调用,而不是为Java/BlazeDS->Flex方向调用。

    我现在在看海关 PropertyProxy BlazeDS的实现,但这看起来也不对。

    另一个想法是 Externalizable 在我们的javadto上,这似乎是太多的工作了,特别是当我看到BlazeDS的竞争对手GraniteDS时,这表明在他们的文档中插入了Joda时间支持和一个简单的类型转换器!

    任何想法都值得欣赏。

    3 回复  |  直到 14 年前
        1
  •  15
  •   SteveD    14 年前

    好吧-我自己找到答案了。这需要编写我自己的AMF端点类+相关的序列化类。我得说那边的人 http://flexblog.faratasystems.com 一直是黑客火焰的灵感源泉。

    这段代码真的应该被合并到BlazeDS本身或者一些开源的扩展项目中——它是如此的基本。

    频道定义

        <channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
            <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf" class="ch.hedgesphere.core.blazeds.endpoint.AMFEndpoint"/>
    
             <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);
    }
    
    @Override
    public 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();
    }   
    }
    

    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"})
    @Override
    public 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"})
    @Override
    public Object createInstance(Object source, Class type) {
        return super.createInstance(source, type);
    }
    }
    
        2
  •  1
  •   cliff.meyers    13 年前

    对于使用来自SpringSource的Spring BlazeDS集成项目的Java应用程序,有一种更简单的方法来处理:

    • 编写一个GenericConverter的实现,它处理将ReadableDateTime映射到java.util.Date或从java.util.Date映射到java.util.Date。

    • 创建AbstractAmfConversionServiceConfigProcessor的子类并重写configureConverters,将转换器实现添加到注册表中。

    XML格式:

    <flex:message-broker>
        <flex:config-processor ref="customConfigProcessor"/>
    </flex:message-broker>
    

    http://static.springsource.org/spring-flex/docs/1.5.x/reference/html/index.html#amf-custom-converters

        3
  •  0
  •   Benjamin Seiller    8 年前

    您是否尝试过此博客中概述的自定义封送拆收器方法:

    http://flexblog.faratasystems.com/index.php/custom-type-masrhaller-in-blazeds

    推荐文章