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

Axis客户端序列化程序/反序列化程序

  •  2
  • user5365075  · 技术社区  · 8 年前

    我有一个数组 MyBean 通过我的服务器端Axis web服务发送。我通过添加

    <beanMapping qname="MyBean" xmlns:ns="myns.MyBeanService"
                     languageSpecificType="java:myns.Appartment"/>
    

    现在我明白了 No deserializer for {myns.MyBean}MyBean 在客户端。由于没有服务器配置,我如何告诉客户端使用默认的BeanSerializer和BeanDeserializer。wsdd?

    1 回复  |  直到 8 年前
        1
  •  0
  •   user5365075    8 年前

    ( source p51 )在客户端类中 MyServiceSoapBindingStub ,就在之后

    org.apache.axis.client.Call _call = createCall();
    

    添加

    QName qn = new QName("myns.MyBeanService", "MyBean");
    
    call.registerTypeMapping(MyBean.class, qn,
            new BeanSerializerFactory(cl, qn),
            new BeanDeserializerFactory(cl, qn));
    

    这需要客户端具有 MyBean.java .

    此外,如果 MyBean 如果有子bean,则应为所有子bean添加相同的代码。定义这样的utils类很方便:

    public final class WSUtils {
    
        public static void handleSerialization(Call call, String ns, String bean, Class cl) {
    
            QName qn = new QName(ns, bean);
    
            call.registerTypeMapping(cl, qn,
                    new BeanSerializerFactory(cl, qn),
                    new BeanDeserializerFactory(cl, qn));
        }
    }
    

    可以在 createCall() 这样地:

    WSUtils.handleSerialization(_call, "myns.MyBeanService", "MyBean", MyBean.class);
    

    对于子bean:

    WSUtils.handleSerialization(_call, "myns.MyBeanService", "MySubBean", MySubBean.class);