很多地方都在说kryo是多么的有效率,多么的快.本人不幸遇到了大量的bug,到了不得不说的地步. 有采用kryo的团队请三思而后行,不然欲哭无泪
kryo版本是 kryo-3.0.3
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 要扑捉异常.
怎么能数据丢失。
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);
}
}
}