这里是我压缩java对象并将对象解压缩回给定类对象的方式。在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;
}
压缩,并且如果压缩类和解压缩的类对象驻留在同一个包中解压缩工作。
如: 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
)类和通过REST
终端将对象发布到server.communication。
当服务器收到压缩字节流和未压缩的obj回到相同的类类型(SampleVO.java),但驻留在不同的包(com.mypro.server.vo
)。当它处理它thorws classNotfoundException com.mypro.client.vo.SampleVO
。
为了克服问题,我重命名服务器端包与客户端包匹配,然后它工作(com.mypro.server.vo into com.mypro.client.vo
)。
但我觉得这不是实现这个优雅的方式。原因是可以有多个压缩对象与服务器端通信,然后我必须重命名所有包以匹配客户端软件包。
所以我的问题是,如何压缩java对象并解压回给定的类类型,如果它们驻留在不同的包和不同的项目。
注意:客户端和服务器是独立的maven项目。
在java中,一个类由不合格的名称+包定义。所以对于java来说,它是不同的包=>不同的类,没有办法绕过它!为什么你的服务器端软件包与客户端软件包不同?你的设计中似乎有些东西坏了。 –