这是我压缩Java对象并将对象解压缩回给定类对象的方法。

压缩代码段

public <T extends Serializable> byte[] compress(T  obj){

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try {
        SnappyOutputStream sos=new SnappyOutputStream(baos);
        ObjectOutputStream objectOut = new ObjectOutputStream(sos);
        objectOut.writeObject(obj);
        objectOut.close();

    } catch (IOException e) {

        throw new RuntimeException();
    }
    return baos.toByteArray();
}


解压缩代码段

public <T extends Serializable> T uncompress(byte[] srcByteArray,
        Class<T> type) {

    ObjectInputStream objectIn = null;
    T obj = null;
    try {
        ByteArrayInputStream bais = new ByteArrayInputStream(srcByteArray);
        SnappyInputStream sis = new SnappyInputStream(bais);
        objectIn = new ObjectInputStream(sis);
        obj = type.cast(objectIn.readObject());
    } catch (Exception e) {

        throw new RuntimeException();
    }

    return obj;

}


如果compress类和uncompress类对象位于同一程序包中,则Compress和uncompress起作用。

例如:
SampleVO.java

package com.mypro.client.vo;
class SampleVO implements Serializable{
   instance fields...
   getter and setters
}


用法

//SampleVO.java resides in  com.mypro.client.vo package
byte[] ar=compress(new SampleVO());
SampleVO s=uncompress(ar,SampleVO.class);


在我的要求下,我要进行客户端服务器通信,客户端压缩SampleVO.java(驻留在com.mypro.client.vo package中)类并将对象发布到server.communication是通过REST端点进行的。

当服务器收到压缩字节流并将未压缩的obj返回到相同的类类型(SampleVO.java),但驻留在不同的包中(com.mypro.server.vo)。

为了克服这个问题,我将服务器端程序包重命名为与客户端程序包匹配,然后它起作用了(classNotfoundException com.mypro.client.vo.SampleVO)。

但是我觉得这不是实现该目标的优雅方法。原因是可以让多个压缩对象与服务器端通信,然后我必须重命名所有软件包以匹配客户端软件包。

所以我的问题是,如果它们驻留在不同的包和不同的项目中,我该如何压缩java对象并解压缩回给定的类类型。

注意:客户端和服务器是单独的Maven项目。

最佳答案

您的问题是您应该拥有三个软件包,而不是两个。一个用于服务器,一个用于客户端,以及一个独立的包/项目用于数据模型,它既不属于客户端也不属于服务器。

然后,数据模型包既是服务器又是客户端的依赖项。

10-07 13:13
查看更多