【问题标题】:Passing Objects as part of SOAP Request and Getting Objects back as Response....using webservices将对象作为 SOAP 请求的一部分传递并将对象作为响应返回......使用 web 服务
【发布时间】:2008-10-18 05:18:26
【问题描述】:

我有一个网络服务,它以 java.lang.object 对象作为参数(因为在运行时只知道对象的 hte 类型)...处理后,回复响应设置 java.lang.Object 给它。

我能够从调用程序向 webservice 发送 reuest 对象,但是在从 webservice 构建响应时收到 NotSerializable 异常。

我知道'如果我们实现 java.io.serializable,mebmers 也应该是可序列化的对象'......这里的 Object 不是可序列化的对象..它没有实现 Serializable....

如果有人可以用正确的解决方案指导 mw..我将不胜感激。

谢谢 巴斯卡

【问题讨论】:

    标签: java web-services


    【解决方案1】:

    我有一个网络服务,它需要 java.lang.object 对象作为参数 (因为在运行时只知道 hte 类型 对象)

    这部分让我很担心。编程时不知道类型是一种代码味道。如果你不知道它是什么,你如何编写代码来处理它?

    可能有正当理由去做您想要完成的事情,但通常有更好的方法。这里真正的问题可能是:“我应该如何设计我的 web 服务和代码,以满足我的需求?”

    当一个方法接受“对象”或其他非常通用的类型时,它们通常包含一个类似开关的结构,该结构检查某些类型并以不同方式处理它们,而“未知”类型要么抛出异常,要么(更糟)可能只是简单地被忽略。 这里的解决方案可能是为每种类型创建一个新方法。 如果它只是一个普通的 Java 方法,或者它是一个 web 服务,这并不重要。

    【讨论】:

      【解决方案2】:

      将对象序列化为字节数组,并在您的 SOAP 调用中将其返回,然后将对象从客户端的字节数组中编组回来。 SOAP 可以轻松有效地处理字节数组,而序列化将是 SOAP 事务范围之外的实现细节。

      【讨论】:

        【解决方案3】:

        要解决您当前的问题,您应该接受“Serializable”而不是“Object”。然后你需要让你的类可序列化。如果你不能这样做,你将永远无法通过网络服务传输对象。

        这是您必须了解的核心:如果它可以通过网络服务传输,则意味着可以序列化它。如果可以序列化,就可以将其设为 Serializable。

        如果你不能修改类本身,你可以解决这个问题。例如,您可以创建一个新的 Serializable 类,该类可以从您的对象中读取所有相关信息。

        说一个 Serializable 类的所有成员也需要 Serializable 并不是完全正确的。所有需要的数据都需要可序列化,但类本身不需要实现 Serializable 接口。

        另一种方法是实现这两种方法:

        private void writeObject(java.io.ObjectOutputStream out) throws IOException;
        private void readObject(java.io.ObjectInputStream in) throws IOException, classNotFoundException;
        

        这里有一篇关于序列化的文章:Discover the secrets of the Java Serialization API

        在“自定义默认协议”下描述了如何使用这两种方法。

        如果这还不够高级,请继续阅读“创建您自己的协议:Externalizable 接口”,了解如何实现 Externalizable 接口(Serializable 的子接口),它使您可以完全控制序列化过程。

        (我忽略了“瞬态”功能,因为我认为您需要它们,因为我假设您需要它们。如果我的假设是错误的,请阅读“不可序列化对象”部分。)

        【讨论】:

          【解决方案4】:

          如果该类的成员没有实现 Serializable,那么您就不能对其使用本机 Java 序列化。这基本上就是您的错误消息告诉您的内容。

          如果您不能使底层对象实现 Serializable,那么您可能必须找到一种不同的序列化方法来传入和传出 Web 服务。 Java 中流行的变种是 XML、JSON、AMF,尽管您总是可以自己滚动。

          如果您在请求的任一端都有 Java 对象,那么请确保将代码分解,以便您的序列化和反序列化代码位于两端都可以使用的库中。这将大大减轻您在实现中的测试负担。

          我建议将所有序列化代码保留在域对象本身之外。考虑使用工厂模式来创建对象。

          HTH

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-11-22
            • 1970-01-01
            • 2021-08-13
            • 1970-01-01
            • 1970-01-01
            • 2012-07-20
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多