2017-01-10 60 views
1

这里是我压缩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项目。

+0

在java中,一个类由不合格的名称+包定义。所以对于java来说,它是不同的包=>不同的类,没有办法绕过它!为什么你的服务器端软件包与客户端软件包不同?你的设计中似乎有些东西坏了。 –

回答

2

你的问题是你应该有三个包,而不是两个。一个用于服务器,一个用于客户端,另一个用于数据模型的独立程序包/项目,它不属于客户端或服务器。

数据模型包是服务器和客户端的依赖关系。