Java网络编程-对象编解码方案、优劣对比

书籍推荐:

  实例代码 :http://download.csdn.net/detail/jiangtao_st/7677503

  1.  用户对象

    /**
     *
     * <p>
     *用户实体对象定义
     * </p>
     *
     * @author 卓轩
     * @创建时间:2014年6月20日
     * @产品: UIC
     * @version: V1.0
     */
    public class UserDO implements Serializable {
    
    	private static final long serialVersionUID = 7289036533757178921L;
    
    	/**
    	 * userid
    	*/
    	private int userId;
    
    	/**
    	 * email
    	*/
    	private String email;
    
    	/**
    	 * uname
    	*/
    	private String uname;
    
    	/**
    	 * unick
    	*/
    	private String unick;
    
    	/**
    	 * sex
    	*/
    	private Integer sex;
    
    	public int getUserId() {
    		return userId;
    	}
    
    	public void setUserId(int userId) {
    		this.userId = userId;
    	}
    
    	public String getEmail() {
    		return email;
    	}
    
    	public void setEmail(String email) {
    		this.email = email;
    	}
    
    	public String getUname() {
    		return uname;
    	}
    
    	public void setUname(String uname) {
    		this.uname = uname;
    	}
    
    	public String getUnick() {
    		return unick;
    	}
    
    	public void setUnick(String unick) {
    		this.unick = unick;
    	}
    
    	public Integer getSex() {
    		return sex;
    	}
    
    	public void setSex(Integer sex) {
    		this.sex = sex;
    	}
    
    	@Override
    	public String toString() {
    		return "UserDO ["+this.userId+"],["+this.uname+"],["+this.unick+"],["+this.email+"]";
    	}
    
    	public byte [] coder(){
    
    		ByteBuffer buffer = ByteBuffer.allocate(1024);
    
    		byte [] email = this.email.getBytes();
    		buffer.putInt(email.length);
    		buffer.put(email);
    
    		byte [] uname =this.uname.getBytes();
    		buffer.putInt(uname.length);
    		buffer.put(uname);
    
    		byte [] unick = this.unick.getBytes();
    		buffer.putInt(unick.length);
    		buffer.put(unick);
    
    		buffer.putInt(this.sex);
    		buffer.putInt(this.userId);
    
    		buffer.flip();
    		byte[] result = new byte[buffer.remaining()];
    		buffer.get(result);
    		return result;
    	}
    
    }
  2.  对比方案

    /**
     *
     * <p>
     * 	对比对象编解码 优劣
     *
     *  代码通过从同一个对象,使用jdk序列化 和 二进制编解码 ,从执行时间,产生的字节大小作对比
     * </p>
     *
     * @author 卓轩
     * @创建时间:2014年7月8日
     * @version: V1.0
     */
    public class ObjectCoderCompare {
    
    	/**
    	 * 对比序列化文件大小
    	 */
    	@Test
    	public void sizeByteCompare(){
    
    		try {
    			UserDO zhuoxuan = new UserDO();
    			zhuoxuan.setUserId(113445);
    			zhuoxuan.setSex(1);
    			zhuoxuan.setUname("卓轩");
    			zhuoxuan.setUnick("zhuoxuan");
    			zhuoxuan.setEmail("[email protected]");
    
    			System.out.println("byte array 序列化大小:" + zhuoxuan.coder().length);
    
    			//jdk 序列化对象
    			ByteArrayOutputStream bos = new ByteArrayOutputStream();
    			ObjectOutputStream objectOutputStream = new ObjectOutputStream(bos);
    			objectOutputStream.writeObject(zhuoxuan);
    			objectOutputStream.flush();
    			objectOutputStream.close();
    			byte[] byteArray = bos.toByteArray();
    			System.out.println("jdk序列化对象大小:" + byteArray.length);
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    
    	/**
    	 * 执行时间,性能对比
    	 */
    	@Test
    	public void performCompare(){
    
    		try {
    			UserDO zhuoxuan = new UserDO();
    			zhuoxuan.setUserId(113445);
    			zhuoxuan.setSex(1);
    			zhuoxuan.setUname("卓轩");
    			zhuoxuan.setUnick("zhuoxuan");
    			zhuoxuan.setEmail("[email protected]");
    
    			long startTime = System.currentTimeMillis();
    			int count = 1000000;
    			for (int i = 0; i < count; i++) {
    				zhuoxuan.coder();
    			}
    			long endTime = System.currentTimeMillis();
    			System.out.println("byte array 执行时间:" + (endTime-startTime) + "ms");
    
    			startTime = System.currentTimeMillis();
    			for (int i = 0; i < count; i++) {
    				//jdk 序列化对象
    				ByteArrayOutputStream bos = new ByteArrayOutputStream();
    				ObjectOutputStream objectOutputStream = new ObjectOutputStream(bos);
    				objectOutputStream.writeObject(zhuoxuan);
    				objectOutputStream.flush();
    				objectOutputStream.close();
    				byte[] byteArray = bos.toByteArray();
    			}
    			endTime = System.currentTimeMillis();
    			System.out.println("jdk 序列化对象 执行时间:" + (endTime-startTime) + "ms");
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    	}
    }
  3. 运行结果

    byte array 序列化大小:54

    jdk序列化对象大小:267

Java网络编程-对象编解码方案、优劣对比

时间: 2024-11-07 09:52:42

Java网络编程-对象编解码方案、优劣对比的相关文章

Netty实战-对象编解码,Netty对象网络传递

书籍推荐:        实例代码 :http://download.csdn.net/detail/jiangtao_st/7677503 Server端代码 <span style="font-size:12px;">/** * * <p> * Netty Server Simple * </p> * * LineBasedFrameDecoder + 消息中得换行符 * * @author 卓轩 * @创建时间:2014年7月7日 * @ver

Java网络编程基础

一.Java网络编程 网络编程在如今这样的网络时代是十分重要的,Java语言提供了丰富的类库来支持网络编程.这里将重点介绍Java.net中的类,充分了解认识Java网络编程的原理并深入学习各模块.在学习Java网络编程之前首先需要具备一定的网络知识:网络的层次结构,常见的网络协议(TCP/IP),IP地址端口号等等.需要学习了解这些内容,可以参考前面的文章. 二.主机地址和IP地址 在进行网络访问时,每个主机都有IP地址,也有主机名(域名),为了便于处理与之相关的问题,Java.net包中提供

Java网络编程知识点(1)

如何将一个String对象转换成InputStream对象? ByteArrayInputStream inputStream = new ByteArrayInputStream(str.getBytes()); 如何替换掉网络URL里面的参数值? String baseURL = "http://sixweather.3gpk.net/SixWeather.aspx?city=%s"; String cityName = "武汉"; String resultU

Java网络编程和NIO详解5:Java 非阻塞 IO 和异步 IO

Java网络编程和NIO详解5:Java 非阻塞 IO 和异步 IO Java 非阻塞 IO 和异步 IO 转自https://www.javadoop.com/post/nio-and-aio 本系列文章首发于我的个人博客:https://h2pl.github.io/ 欢迎阅览我的CSDN专栏:Java网络编程和NIO https://blog.csdn.net/column/details/21963.html 部分代码会放在我的的Github:https://github.com/h2p

Java网络编程和NIO详解9:基于NIO的网络编程框架Netty

Java网络编程和NIO详解9:基于NIO的网络编程框架Netty 转自https://sylvanassun.github.io/2017/11/30/2017-11-30-netty_introduction/ netty是基于NIO实现的异步事件驱动的网络编程框架,学完NIO以后,应该看看netty的实现,netty框架涉及的内容特别多,这里只介绍netty的基本使用和实现原理,更多扩展的内容将在以后推出. 本系列文章首发于我的个人博客:https://h2pl.github.io/ 欢迎

用java网络编程中的TCP方式上传文本文件及出现的小问题

自己今天刚学java网络编程中的TCP传输,要用TCP传输文件时,自己也是遇到了一些问题,抽空把它整理了一下,供自己以后参考使用. 首先在这个程序中,我用一个客户端,一个服务端,从客户端上传一个文本文件给服务端,服务端接收数据并显示“上传成功”给客户端. 客户端: 1 import java.io.BufferedReader; 2 import java.io.FileReader; 3 import java.io.IOException; 4 import java.io.InputStr

java网络编程serversocket

转载:http://www.blogjava.net/landon/archive/2013/07/24/401911.html Java网络编程精解笔记3:ServerSocket详解ServerSocket用法详解 1.C/S模式中,Server需要创建特定端口的ServerSocket.->其负责接收client连接请求. 2.线程池->包括一个工作队列和若干工作线程->工作线程不断的从工作队列中取出任务并执行.-->java.util.concurrent->线程池

20145311实验四 &quot;Java网络编程及安全&quot;

20145311实验四 "Java网络编程及安全" 程序设计过程 实验内容 ·掌握Socket程序的编写:·掌握密码技术的使用:·设计安全传输系统 ·利用加解密代码包,编译运行代码,一人加密,一人解密:·集成代码,一人加密后通过TCP发送: 实验步骤 在这之前进行了一个socket连接的例子:用百度做了个实验 下面是两人合作进行RSA的加密: 首先建立一个Socket对象,用来连接特定服务器的指定端口(我负责的是服务器端,郑凯杰负责的是客户端,所以也就是输入我这边的ip地址),输入的参

java网络编程socket解析

转载:http://www.blogjava.net/landon/archive/2013/07/02/401137.html Java网络编程精解笔记2:Socket详解 Socket用法详解 在C/S通信模式中,client需要主动创建于server连接的Socket(套接字).服务器端收到了客户端的连接请求,也会创建与客户连接的Socket.Socket可看做是通信两端的收发器.server与client都通过Socket来收发数据. 1.构造Socket 1.Socket() 2.So