2014.07.10

一    今天测试了下json和protobuf的大小

过程如下:

1.将protobuf的编译器protoc.exe放到测试项目testprotobuf根目录下

2.在testprotobuf下新建一个文件夹prof,并建立文件proto文件 test.proto

package tutorial;

option java_package = "com.example.testbean";
option java_outer_classname = "TestBean";

message Person {
  optional string str = 1;
  optional int32 int = 2;
  optional double dbl = 3;
  optional bool b=4;
  optional sint32 sint=5;

}

  3.cmd进入testprotobuf里 输入命令protoc --java_out=./src prof/test.proto自动生成TestBean文件

   4.将编译好的protobuf-java-2.5.0.jar放到classpath里

   5.新建AddPerson.java

  

package com.example.testbean;

import org.vertx.java.core.json.JsonObject;
import com.example.testbean.TestBean.Person;

public class AddPerson {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		Person.Builder person=Person.newBuilder();
		boolean b=true;
		person.setB(b);
		byte[] bArray=person.build().toByteArray();
		System.out.println("boolean|"+b+":"+bArray.length);
		
		double dbl=2.11457;
		person.clear();
		person.setDbl(dbl);
		bArray=person.build().toByteArray();
		System.out.println("double|"+dbl+":"+bArray.length);
		
		int intp=3000;
		person.clear();
		person.setInt(intp);
		bArray=person.build().toByteArray();
		System.out.println("int|"+intp+":"+bArray.length);
		
		int intn=-3000;
		person.clear();
		person.setInt(intn);
		bArray=person.build().toByteArray();
		System.out.println("int|"+intn+":"+bArray.length);
		
		person.clear();
		person.setSint(intn);
		bArray=person.build().toByteArray();
		System.out.println("ints|"+intn+":"+bArray.length);
		
		person.clear();
		String s="test";
		person.setStr(s);
		bArray=person.build().toByteArray();
		System.out.println("string|"+s+":"+bArray.length);
		
		System.out.println("--------");
		JsonObject js=new JsonObject();
		js.putBoolean("b",b );
		bArray=js.encode().getBytes();
		System.out.println("boolean|"+b+":"+bArray.length);
		
		js=new JsonObject();
		js.putNumber("d",dbl );
		bArray=js.encode().getBytes();
		System.out.println("double|"+dbl+":"+bArray.length);
		
		
		js=new JsonObject();
		js.putNumber("i",intp );
		bArray=js.encode().getBytes();
		System.out.println("int|"+intp+":"+bArray.length);
		
		js=new JsonObject();
		js.putNumber("n",intn );
		bArray=js.encode().getBytes();
		System.out.println("int|"+intn+":"+bArray.length);
		
		js=new JsonObject();
		js.putString("s",s );
		bArray=js.encode().getBytes();
		System.out.println("String|"+s+":"+bArray.length);
		
		
	}

}

  测试结果如下:

boolean|true:2
double|2.11457:9
int|3000:3
int|-3000:11
ints|-3000:3
string|test:6
--------
boolean|true:10
double|2.11457:13
int|3000:10
int|-3000:11
String|test:12

根据上面可以看出

1.json基本上把所有数据当做字符串进行传输。所以类似于double数据,位数越多,越占空间,而protobuf则不然,不管多长的double类型,protobuf都是9位byte(改变double位数可以看出来这点)。

2.protobuf  sint对于负数的优化能力是很强的。

3.protobuf是根据数据类型进行优化的。根据文档protobuf对于数组进行了encode操作,具体文档https://developers.google.com/protocol-buffers/docs/encoding,个人表示没看懂。

4.对于json来说 key和“{”,“[”也是需要占用空间,但是对于protobuf来说 key 用1,2,3来代替。只占用1个btye 但是16以后就是2个btye。

结论:

是否使用还是得根据数据类型来决定。


二 Vertx的服务器和客户端

之前写的vertx例子 都无法在Eclipse直接启动。根据这篇文章进行设置才能能启动http://my.oschina.net/wstone/blog/151881。

1. 首先下载vert.x-2.0.2-final.zip,然后解压到一个目录里.

2. 在Eclipse里创建一个空的Java项目.

3. 在Eclipse里创建一个User Lib: "Vert.x",把Vert.x的Lib目录下的jar文件全部加入.

4. 创建一个新的的Debug配置,打开配置窗口,把新建的项目从Classpath页的User Entries里删除掉,然后添加UserLib库"Vert.x",再添加Vert.X安装目录下的conf目录

5. 把Main页里的Main class:改成: org.vertx.java.platform.impl.cli.Starter

6. 把Arguments页里的Program arguments改成:"run 需要测试的vertile类名 -cp ${project_loc:项目名}/编译类的输出目录";

   把Working directory设置成Vert.x的安装目录.

7. 在Source页里把新建的项目添加进Source Lookup Path里

8. 保存调试配置,至此完成!

三 服务端和客户端整合protobuf

     服务端代码

    

package com.test;

import org.vertx.java.core.Handler;
import org.vertx.java.core.buffer.Buffer;
import org.vertx.java.core.net.NetSocket;
import org.vertx.java.platform.Verticle;

import com.test.TestBean.Person;

public class TestServer extends Verticle {
	  
	  public Person buildPerson(){
		  Person.Builder person=Person.newBuilder();
		  boolean b=true;
		
		  person.setB(true);
		  person.setDbl(2.141);
		  person.setStr("abc");
		  return person.build();
	  }
	
	
	  @Override
	public void start() {
		    vertx.createNetServer().connectHandler(new Handler<NetSocket>() {
		      @Override
			public void handle(final NetSocket socket) {
		    	  socket.dataHandler(new Handler<Buffer>(){
		    		 @Override
					public void handle(Buffer buffer){
		    			 System.out.println(buffer.length());
		    			 Buffer buf=new Buffer();
		    			 Person person=buildPerson();
		    			 buf.appendBytes(person.toByteArray());
		    			 socket.write(buf);
		    		 }
		    	  });
		      }
		      
		      
		    }).listen(1234);
		  }
}
客户端代码

package com.test;

import org.vertx.java.core.AsyncResult;
import org.vertx.java.core.AsyncResultHandler;
import org.vertx.java.core.Handler;
import org.vertx.java.core.buffer.Buffer;
import org.vertx.java.core.net.NetSocket;
import org.vertx.java.platform.Verticle;

import com.test.TestBean.Person;

public class TestClient extends Verticle {

	

	public void start(){
		
		vertx.createNetClient().connect(1234, "localhost", new AsyncResultHandler<NetSocket>() {
			public void handle(AsyncResult<NetSocket> asyncResult){
				if(asyncResult.succeeded()){
					 NetSocket socket = asyncResult.result();
			          socket.dataHandler(new Handler<Buffer>() {
			            public void handle(Buffer buffer) {
			            	System.out.println("Net client receiving: " + buffer);
			            	try{
			            		Person p=Person.parseFrom(buffer.getBytes());
			            		System.out.println(p.getDbl());
			            		System.out.println(p.getStr());
			            	}catch(Exception e){
			            		e.printStackTrace();
			            	}
			            }
			          });
			          //Now send some data
			          for (int i = 0; i < 10; i++) {
			            String str = "hello" + i + "\n";
			            System.out.print("Net client sending: " + str);
			            socket.write(new Buffer(str));
			          }
				}else{
					asyncResult.cause().printStackTrace();
				}
				
			}
		});
	}
	
}

整合遇到的问题,将protobuf-java-2.5.0.jar放到classpath里,启动服务器始终报错,找不到person类。尝试clean project失败,怀疑是vertx没找准路径。

解决:将protobuf-java-2.5.0.jar 放到vert.x 个user lib里就可以了。


   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GeoPandas是一个开源的Python库,旨在简化地理空间数据的处理和分析。它结合了Pandas和Shapely的能力,为Python用户提供了一个强大而灵活的工具来处理地理空间数据。以下是关于GeoPandas的详细介绍: 一、GeoPandas的基本概念 1. 定义 GeoPandas是建立在Pandas和Shapely之上的一个Python库,用于处理和分析地理空间数据。 它扩展了Pandas的DataFrame和Series数据结构,允许在其中存储和操作地理空间几何图形。 2. 核心数据结构 GeoDataFrame:GeoPandas的核心数据结构,是Pandas DataFrame的扩展。它包含一个或多个列,其中至少一列是几何列(geometry column),用于存储地理空间几何图形(如点、线、多边形等)。 GeoSeries:GeoPandas中的另一个重要数据结构,类似于Pandas的Series,但用于存储几何图形序列。 二、GeoPandas的功能特性 1. 读取和写入多种地理空间数据格式 GeoPandas支持读取和写入多种常见的地理空间数据格式,包括Shapefile、GeoJSON、PostGIS、KML等。这使得用户可以轻松地从各种数据源中加载地理空间数据,并将处理后的数据保存为所需的格式。 2. 地理空间几何图形的创建、编辑和分析 GeoPandas允许用户创建、编辑和分析地理空间几何图形,包括点、线、多边形等。它提供了丰富的空间操作函数,如缓冲区分析、交集、并集、差集等,使得用户可以方便地进行地理空间数据分析。 3. 数据可视化 GeoPandas内置了数据可视化功能,可以绘制地理空间数据的地图。用户可以使用matplotlib等库来进一步定制地图的样式和布局。 4. 空间连接和空间索引 GeoPandas支持空间连接操作,可以将两个GeoDataFrame按照空间关系(如相交、包含等)进行连接。此外,它还支持空间索引,可以提高地理空间数据查询的效率。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值