Вы можете попробовать пользовательский механизм сериализации для элементов внутри хэш-карты.
Какую информацию вы отправляете? как выглядит объект внутри?
Даже если использовать механизм по умолчанию и пометить все ненужные атрибуты как переходные, это поможет.
Кроме того, вы можете попытаться отправить данные, которые вы сами сериализировали, до ZipOutputStream , но я бы позволил это как последний ресурс, поскольку двоичный контент не будет слишком сильно сжиматься.
EDIT
Поскольку вы используете только строки, вы можете создать оболочку, пользовательская сериализация которой представляет собой сжатый массив (почти как ответ Питера Лоури), но использование пользовательской сериализации позволит вам инкапсулировать процесс сериализации и заставить его работать несколько прозрачно. "для RMI (сериализация RMI никогда не узнает, что вы используете сжатую версию)
Вот демоверсия:
import java.io.*;
import java.util.*;
import java.util.zip.*;
public class MapDemo implements Serializable {
private Map<String,String> map = new HashMap<String,String>();
// only for demo/comparison purposes, default would use compressoin always
private boolean useCompression;
public MapDemo( Map<String,String> map , boolean compressed ) {
this.map = map;
this.useCompression = compressed;
}
// This is the custom serialization using compression
private void writeObject(ObjectOutputStream out) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
OutputStream os = useCompression ? new DeflaterOutputStream( baos ) : baos;
ObjectOutputStream oos = new ObjectOutputStream( os );
oos.writeObject( this.map );
oos.close();
out.write( baos.toByteArray() );
}
}
class Main {
public static void main( String [] args ) throws IOException {
Map<String,String> regular = new HashMap<String,String>();
Map<String,String> compressed = new HashMap<String,String>();
Random r = new Random();
for( int i = 0 ; i < 100000 ; i++ ) {
String key = ""+r.nextInt(1000000);
String value = ""+r.nextInt(1000000) ;
// put the same info
compressed.put( key , value );
regular.put( key , value );
}
save( new MapDemo( compressed, true ) , "map.compressed");
save( new MapDemo( regular, false ) , "map.regular");
}
private static void save( Object o, String toFile ) throws IOException {
// This is similar to what RMI serialization would do behind scenes
ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream(toFile));
oos.writeObject( o );
oos.close();
}
}