kryo 3.0 测试遇到的bug

很多地方都在说kryo是多么的有效率,多么的快.本人不幸遇到了大量的bug,到了不得不说的地步. 有采用kryo的团队请三思而后行,不然欲哭无泪


kryo版本是 kryo-3.0.3 

kryo 3.0 测试遇到的bug_第1张图片

class info  implements Serializable{
	 
	private static final long serialVersionUID = -4914434736682797733L;
	String id;
	String name;
	String password;
	public info() {
		// TODO Auto-generated constructor stub
	}
	public info(String id,String name,String password) {
		// TODO Auto-generated constructor stub
		
		this.id=id;
		this.name=name;
		this.password=password;
	}
	
	public String getId() {
		return id;
	}
	public String getName() {
		
		return name;
	}
	public String getPassword() {
		return password;
	}

	public String  select() {
		
		return id+" "+name+" "+password;
	}
	public String getitem(String key) {
		
		switch (key) {
		case "name":
			key=this.getName();
			break;
		case "id":
			key=this.getId();
			break;
		case "password":
			key=this.getPassword();
			break;
		default:
			key=" the key is not here";
			break;
		}
		
		return key;
		
	}
	
}



import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.HashMap;

import org.objenesis.strategy.StdInstantiatorStrategy;

import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.KryoException;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;


public class ttt {
	
	public static void main(String []agrs) throws Exception {
		 	Kryo kryo = new Kryo();  
		  
        kryo.setReferences(false);  
  
        kryo.setRegistrationRequired(false);  
  
        kryo.setInstantiatorStrategy(new StdInstantiatorStrategy());  
  
        kryo.register(wty.class); kryo.register(info.class); 
        kryo.register(HashMap.class); 

        Output output = new Output(new FileOutputStream("c:/file.bin"));
	      
		for (int i = 0; i < 20; i++) {
			kryo.writeObject(output, new info("1","admin","888888"));
		}
		output.flush();
		output.close();
	 	
        long p=System.currentTimeMillis();
		Input input = new Input(new FileInputStream("c:/file.bin"));
		 
		
		HashMap map=new HashMap<>();
		
		info in=null;
		int tt=0;
		System.out.println(".......................");
		do{ 
			try{
				in=kryo.readObjectOrNull(input, info.class);
				 map.put(in.id, in);  //没办法加了 try catch 
			}catch(KryoException e)
			{
				break;
			}
		 System.out.println(in.getId()+" "+in.getName()+" "+in.getPassword());
			
			
		}while(in!=null);
	   
		System.out.println(".......................");
		System.out.println(map.size());
		
		System.out.println(map.get("8"));
		
		input.close();
		System.out.println("time:"+(System.currentTimeMillis()-p));
		 
		
	}

}


//readobject 要扑捉异常.



必捕捉KryoException 异常,如果插入100000,经常读到1000就buffer underflow。


代码段

kryo 3.0 测试遇到的bug_第2张图片





但是结果根本就是不对。

kryo 3.0 测试遇到的bug_第3张图片

file.bin 文件是这样子的 kryo 3.0 测试遇到的bug_第4张图片



怎么能数据丢失。

ok... 这个些有人还说 没关系他的速度快。ok。我们继续测试

写入 arraylist


 

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.HashMap;


import org.objenesis.strategy.StdInstantiatorStrategy;


import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.KryoException;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;




public class ttt {
	
	public static void main(String []agrs) throws Exception {




		Kryo kryo = new Kryo();  
		  
        kryo.setReferences(false);  
  
        kryo.setRegistrationRequired(false);  
  
        kryo.setInstantiatorStrategy(new StdInstantiatorStrategy());  
  
        kryo.register(wty.class); kryo.register(info.class); 
       // kryo.register(HashMap.class);  
     kryo.register(ArrayList.class); 


        Output output = new Output(new FileOutputStream("c:/file.bin"));
	     
        long p=System.currentTimeMillis();
        
        ArrayList list=new ArrayList<>();
        
        
		for (int i = 0; i < 1000000; i++) {
			list.add(new info(String.valueOf(i),"admin","admin8888"));
		}
		
		kryo.writeObject(output, list);
		output.flush();
		output.close();
		System.out.println("time:"+(System.currentTimeMillis()-p));
		list.clear();
		 
		ArrayList list1=new ArrayList<>();
		Input input = new Input(new FileInputStream("c:/file.bin"));
		list1 = kryo.readObject(input,ArrayList.class);
		input.close();
		
		System.out.println(list1.size());
		
		 for (int i = 999990; i < list1.size(); i++) {
			 
			 info t=list1.get(i);
			 System.out.println(t.getId()+" "+t.getName()+ " "+t.getPassword());
			 
			
		}
		
		 
	}


}

查看数据写入成功   //时间很快,插入1m也就几秒 没办法读取。如果有知道请告诉我!!!

time:14
.......................
Exception in thread "main" java.lang.NullPointerException
at java.util.ArrayList.ensureExplicitCapacity(Unknown Source)
at java.util.ArrayList.ensureCapacity(Unknown Source)
at com.esotericsoftware.kryo.serializers.CollectionSerializer.read(CollectionSerializer.java:114)
at com.esotericsoftware.kryo.serializers.CollectionSerializer.read(CollectionSerializer.java:40)
at com.esotericsoftware.kryo.Kryo.readObjectOrNull(Kryo.java:738)
at t5.ttt.main(ttt.java:57)


但是hashmap 还是可以正常读取的

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.HashMap;

import org.objenesis.strategy.StdInstantiatorStrategy;

import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.KryoException;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;


public class ttt {
	
	public static void main(String []agrs) throws Exception {
		 	Kryo kryo = new Kryo();  
		  
        kryo.setReferences(false);  
  
        kryo.setRegistrationRequired(false);  
  
        kryo.setInstantiatorStrategy(new StdInstantiatorStrategy());  
  
        kryo.register(wty.class); kryo.register(info.class); 
       // kryo.register(HashMap.class); 

        Output output = new Output(new FileOutputStream("c:/file.bin"));
	     
        long p=System.currentTimeMillis();
        
        HashMap map=new HashMap<>();
        
        
		for (int i = 0; i < 1000000; i++) {
			map.put(i,new info(String.valueOf(i),"admin","admin8888"));
		}
		
		kryo.writeObject(output, map);
		output.flush();
		output.close();
		System.out.println("time:"+(System.currentTimeMillis()-p));
		
		 
		 HashMap map1=new HashMap<>();
		Input input = new Input(new FileInputStream("c:/file.bin"));
		map1 = kryo.readObject(input,HashMap.class);
		input.close();
		
		System.out.println(map1.size());
		
		 for (int i = 999990; i < map1.size(); i++) {
			 
			 info t=map1.get(i);
			 System.out.println(t.getId()+" "+t.getName()+ " "+t.getPassword());
			 
			
		}
		
		 
	}

}

 
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.HashMap;

import org.objenesis.strategy.StdInstantiatorStrategy;

import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;


public class ttt {
	
	public static void main(String []agrs) throws Exception {
		 	Kryo kryo = new Kryo();  
		  
        kryo.setReferences(false);  
  
        kryo.setRegistrationRequired(false);  
  
        kryo.setInstantiatorStrategy(new StdInstantiatorStrategy());  
  
        kryo.register(wty.class); kryo.register(info.class); 
       // kryo.register(HashMap.class); 

        Output output = new Output(new FileOutputStream("c:/file.bin"));
	     
        long p=System.currentTimeMillis();
        
        HashMap map=new HashMap<>();
        
        
		for (int i = 0; i < 100; i++) {
			map.put(i,"sdfsdf");
		}
		
		kryo.writeObject(output, map);
		output.flush();
		output.close();
		System.out.println("time:"+(System.currentTimeMillis()-p));
		
		 
		 HashMap map1=new HashMap<>();
		Input input = new Input(new FileInputStream("c:/file.bin"));
		map1 = kryo.readObject(input,HashMap.class);
		input.close();
		
		System.out.println(map1.size());
		
		 for (int i = 0; i < map1.size(); i++) {
			 
			 String t=map1.get(i);
			 System.out.println(t);
			 
		}
		
		 
	}

}



你可能感兴趣的:(kryo 3.0 测试遇到的bug)