这是我压缩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项目。
最佳答案
您的问题是您应该拥有三个软件包,而不是两个。一个用于服务器,一个用于客户端,以及一个独立的包/项目用于数据模型,它既不属于客户端也不属于服务器。
然后,数据模型包既是服务器又是客户端的依赖项。