序列化和反序列化不实现java.io.Serializable的对象

时间:2012-10-13 02:02:27

标签: java web-services serialization soap deserialization

我想将SOAPMessage转换为字节数组,以便我可以对其进行加密,然后在代理服务器中对其进行解密,代理服务器将代表我进行Web服务的调用。 问题是SOAPMessage没有实现java.io.Serializable,因此我无法继续加密它。

我用它来序列化

public static byte[] serializeSoapMessage (SOAPMessage sm){
    try {

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        sm.writeTo(baos);
       byte[] bytes= baos.toByteArray();
       return bytes;
    } catch (SOAPException ex) {
        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
    }
    return null;
}

但是反序列化是一个问题,因为ObjectInputStream需要java.io.Serializable的实现

感谢您的问候:)

1 个答案:

答案 0 :(得分:1)

我认为您不太了解SOAPMessage.writeTo正在做什么(或对象流如何工作)。据我所知,writeTo将为SOAPMessage创建XML,并将其作为字节写入给定的流。要阅读它,请使用MessageFactory及其createMessage方法。写入流的信息不是对象(ObjectInputStream期望的对象),而是数据。

要执行您想要的操作,请将ByteArrayOutputStream包裹在CipherOutputStream中(请参阅this question以查看如何使用密码流包装流)并改为调用sm.writeTo(cipherOutputStream)。这将加密流上的字节,然后您可以将字节发送到您的Web服务。

让Web服务运行解密,方法是将ByteArrayInputStream中收到的字节包装起来,然后将 包装在CipherInputStream中。将生成的CipherInputStream提供给MessageFactory,它将重建原始的SOAPMessage。

不可否认,我不是Web服务方面的专家,因此我无法为您的特定解决方案提供代码,但这种方法肯定会为您提供加密的byte[]发送,其中包含加密SOAPMessage

请注意,对象流无论如何都不会加密任何内容。您可能会这么认为,因为它的输出或多或少是不可读的,但它绝不是加密的。获得加密的唯一方法是使用加密。

一些参考资料:

希望这足以让你开始。