1. 程式人生 > >kryo 3.0 測試遇到的bug

kryo 3.0 測試遇到的bug

很多地方都在說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<String,info> 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。

程式碼段







但是結果根本就是不對。



file.bin 檔案是這樣子的 

怎麼能資料丟失。

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 {
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>public static void main(String []agrs) throws Exception {




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


}

檢視資料寫入成功   //時間很快,插入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<Integer,info> 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<String,info> 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<Integer,String> 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<String,String> 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

很多地方都在說kryo是多麼的有效率,多麼的快.本人不幸遇到了大量的bug,到了不得不說的地步. 有采用kryo的團隊請三思而後行,不然欲哭無淚 kryo版本是 kryo-3.0.3  class info implements Serializable{ p

OpenCV3.3.0測試

eth root 目錄 顯示 pan example opencv3.3 exec pre 安裝包目錄下/samples/cpp裏是各種例程,其中example_cmake裏CMakeLists.txt已寫好,直接用就可以 測試matchmethod_orb_akaze_b

Ubuntu16.04 VTK6.3.0 測試

新建一個測試資料夾,在其中新建下面兩個即可。 1.Plane.cxx #include <vtkVersion.h> #include <vtkPlaneSource.h> #include <vtkPolyData.h> #include <

【故障公告】資料庫伺服器 CPU 近 100% 引發的故障(源於 .NET Core 3.0 的一個 bug

非常抱歉,這次故障給您帶來麻煩了,請您諒解。 今天早上 10:54 左右,我們所使用的資料庫服務(阿里雲 RDS 例項 SQL Server 2016 標準版)CPU 突然飆升至 90% 以上,應用日誌中出現大量資料庫查詢超時的錯誤。 Microsoft.Data.SqlClient.SqlEx

發現了一個關於 gin 1.3.0 框架的 bug

## gin 1.3.0 框架 http 響應資料錯亂問題排查 ### 問題概述 客戶端同時發起多個http請求,gin接受到請求後,其中一個介面響應內容為空,另外一個介面響應內容包含介面1,介面2的響應內容,導致響應資料錯亂(偶現問題) - 圖1紅框標註部分為正常請求響應 - 圖1藍框標註部分為異常請求

3.0-vim編輯器和bash條件測試

編輯器 vim bash 多文件模式: vim FILE1 FILE2 FILE3... :next 下一個 :prev 前一個 :first 第一個 :last 最後一個 :wall 保存所

Android Studio 3.0 | Kotlin 測試

appcompat alt super override 測試 edi mas ast nta Google官方支持了,體驗一下。 XML <?xml version="1.0" encoding="utf-8"?> <LinearLayo

JMeter性能測試3.0時代之-多維度的圖形化HTML報告

emp 監聽器 平臺 spa destroy nature 更多 b- pla 在上一篇博客JMeter性能測試3.0時代之-全新JMeter插件管理中我說會寫真正的JMeter 3.0新特性,時隔兩周,總算在這個周末,暫停其他安排,來繼續這個未完成的系列。本

Android Studio 3.0.1 又見惡心爆的bug。。。xiete

AR 拷貝 transform aid pat use fail 惡心 process 寫了個AIDL的東西,結果一直編譯不通過: Error:Execution failed for task ‘:app:compileDebugAidl‘. >

bug】vue-cli 3.0報錯的解決辦法

文件中 分享圖片 not main res idt 說明 exports 修改 先上bug圖片 bug說明:初裝vue_cli3.0寫了個組件,運行錯誤,顯示如圖, 代碼提示:[Vue warn]: You are using the runtime-only bu

原始碼安裝cuDNN v7.3.0 for CUDA 10.0,並測試cuDNN是否安裝成功

參考: 前提:CUDA 10.0 已經安裝完成!! 1、下載cuDNN: 選擇其他版本: 下載後,解壓,直接將對應標頭檔案和庫拷貝到CUDA的安裝目錄即可,記

Redis 3.0叢集搭建測試(一)

Redis3.0 最大的特點就是有了cluster的能力,使用redis-trib.rb工具可以輕鬆構建Redis Cluster。Redis Cluster採用無中心結構,每個節點儲存資料和整個叢集狀態,每個節點都和其他所有節點連線。節點之間使用gossip協議傳播資訊以

Redis 3.0叢集搭建測試(二)

四、客戶端叢集命令 叢集 cluster info 列印叢集的資訊 cluster nodes 列出叢集當前已知的所有節點(node),以及這些節點的相關資訊。 節點 cluster meet <ip> <port> 將ip和port所指定的節點

JMeter效能測試3.0時代之-多維度的圖形化HTML報告

轉http://www.jianshu.com/p/be8930c4eef2 一.為什麼談這個新特性 在JMeter3.0之前,官方只提供在工具的UI上對測試結果部分維度的圖形化展示,這對我帶來了兩方面的困擾: 在實際使用中,在平臺中整合JMeter後需要頁面展示TPS曲線,平均響應時間曲線等圖表時

JMeter簡單的使用(3.0+)-效能測試(壓力)

JMeter簡單的效能測試使用介紹 工作需要,寫了一份JMeter簡單使用的文件,刪改部分工作相關的圖,應該沒大影響。 下載JMeter 下載原始Jmeter檔案 最新的3.1的下載地址如下 Windows下: Linux下:

android studio 升級3.0後,遇到的相關異常(6-7個bug)描述和解決辦法!

Error:java.util.concurrent.ExecutionException: java.util.concurrent.ExecutionException: com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs fo

EOS 3.0加入測試網路

歡迎來到 EOS Party 測試網路.EOS Party 測試網路是由EOS中文社群基於 EOS DAWN 3.0 組織建立的測試網路,該測試網路旨在為開發者提供更好的線上開發環境.加入 EOS Party 測試網路任何個人,組織都可以加入EOS Party成為BP,加入 

Hadoop 3.0版本測試,終將計算與儲存解耦!

傳統的hadoop架構是建立在相信通過大規模分散式資料處理獲得良好效能的唯一途徑是將計算帶入資料。在本世紀初,這確實是事實。當時,典型的企業資料中心的網路基礎架構不能完成在伺服器之間移動大量資料的任務,資料必須與計算機共存。現在,企業資料中心的網路基礎設施以及公有云提供商的網

mongodb 3.0.2與wiredTiger儲存引擎安裝測試

[[email protected] local]# [[email protected] local]# rm -fR /data/mongodb30/ [[email protected] local]# mkdir -p /data/mongodb30/{db,logs}

.NET Core 3.0 單元測試與 Asp.Net Core 3.0 整合測試

單元測試與整合測試 測試必要性說明 相信大家在看到單元測試與整合測試這個標題時,會有很多感慨,我們無數次的在實踐中提到要做單元測試、整合測試,但是大多數專案都沒有做或者僅建了專案檔案。這裡有客觀原因,已經接近交付日期了,我們沒時間做白盒測試了。也有主觀原因,面對業務複雜的程式碼我們不知道如何入手做單元測試,不