`

Kryo序列化框架开发测试

阅读更多
Kryo序列化框架开发测试
首先加入Kryo依赖包:
asm-4.0.jar
kryo-2.21-all.jar
minlog-1.2.jar
minlog-none-1.2.jar
objenesis-1.2.jar
reflectasm-1.07.jar


加入依赖包之后就可以开发测试了:

Kryo序列化:
public class MySerializableTest {

	public static void main(String[] args) throws IOException {
		long start =  System.currentTimeMillis();
		setSerializableObject();
		System.out.println("Kryo Serializable writeObject time:" + (System.currentTimeMillis() - start) + " ms" );
		start =  System.currentTimeMillis();
		getSerializableObject();
		System.out.println("Kryo Serializable readObject time:" + (System.currentTimeMillis() - start) + " ms");

	}

	public static void setSerializableObject() throws FileNotFoundException{

		Kryo kryo = new Kryo();

		kryo.setReferences(false);

		kryo.setRegistrationRequired(false);

		kryo.setInstantiatorStrategy(new StdInstantiatorStrategy());

	    kryo.register(Simple.class);

		Output output = new Output(new FileOutputStream("file.bin"));
		for (int i = 0; i < 1000000; i++) {
			Map<String,Integer> map = new HashMap<String, Integer>(2);
			map.put("zhang0", i);
			map.put("zhang1", i);
			kryo.writeObject(output, new Simple("zhang"+i,(i+1),map));
		}
		output.flush();
		output.close();
	}


	public static void getSerializableObject(){
		Kryo kryo = new Kryo();

		kryo.setReferences(false);

		kryo.setRegistrationRequired(false);

		kryo.setInstantiatorStrategy(new StdInstantiatorStrategy());

		Input input;
		try {
			input = new Input(new FileInputStream("file.bin"));
			Simple simple =null;
			while((simple=kryo.readObject(input, Simple.class)) != null){
				System.out.println(simple.getAge() + "  " + simple.getName() + "  " + simple.getMap().toString());
			}

			input.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch(KryoException e){

		}
	}

}

public class Simple implements Serializable{

	/**
	 *
	 */
	private static final long serialVersionUID = -4914434736682797743L;

	private String name;

	private int age;

	private Map<String,Integer> map;

	 public Simple(){

	 }

	 public Simple(String name,int age,Map<String,Integer> map){
		 this.name = name;
		 this.age = age;
		 this.map = map;
	 }


	 public String getName() {

	   return name;

	 }

	  public void setName(String name) {

	    this.name = name;

	  }

	  public int getAge() {

	    return age;

	  }

	  public void setAge(int age) {

	    this.age = age;

	  }

	  public Map<String, Integer> getMap() {
		return map;
	}

	public void setMap(Map<String, Integer> map) {
		this.map = map;
	}


	}

现在我们来做个测试,与java自带的序列化做比较,看一下序列化与反序列化的运行时间与序列化后文件大小.

Java 序列化
public class MyJavaSer {

	public static void main(String[] args) throws IOException, ClassNotFoundException {
		long start =  System.currentTimeMillis();
		setSerializableObject();
		System.out.println("java Serializable writeObject time:" + (System.currentTimeMillis() - start) + " ms" );
		start =  System.currentTimeMillis();
		getSerializableObject();
		System.out.println("java Serializable readObject time:" + (System.currentTimeMillis() - start) + " ms");
	}

	public static void setSerializableObject() throws IOException{

		FileOutputStream fo = new FileOutputStream("data.ser");

        ObjectOutputStream so = new ObjectOutputStream(fo);

		for (int i = 0; i < 1000000; i++) {
			Map<String,Integer> map = new HashMap<String, Integer>(2);
			map.put("zhang0", i);
			map.put("zhang1", i);
			so.writeObject(new Simple("zhang"+i,(i+1),map));
		}
		so.flush();
		so.close();
	}

	public static void getSerializableObject(){
		 FileInputStream fi;
		try {
			fi = new FileInputStream("data.ser");
			ObjectInputStream si = new ObjectInputStream(fi);

			Simple simple =null;
			while((simple=(Simple)si.readObject()) != null){
				//System.out.println(simple.getAge() + "  " + simple.getName());
			}
			fi.close();
			si.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			//e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}


	}

}







看一下测试结果(此测试是Simple类没带map属性的情况下测试的):
Kryo:
运行时间:
Kryo Serializable writeObject time:1203 ms
Kryo Serializable readObject time:906 ms
文件大小:
file.bin  13.2M

Java:
运行时间
java Serializable writeObject time:21156 ms
java Serializable readObject time:15500 ms
文件大小:
data.ser       22.7M

经过反复测试:
Kryo的运行速度是java Serializable 的20倍左右
Kryo的文件大小是java Serializable的一半左右。

注意:
   经过测试,序列化对象最好不要带有Java集合类(如:Map,List等),如有会大大降低序列化效率。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics