当前位置: 首页 > news >正文

netty6---序列化与反序列化

package com.cn;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Arrays;

public class Test1 {

    public static void main(String[] args) throws IOException {
        int id = 101;  //把id转换为字节数据,一个int占4个字节,
        int age = 21;
        
        //int转换为字节数组
        ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
        arrayOutputStream.write(int2bytes(id));
        arrayOutputStream.write(int2bytes(age));
        
        byte[] byteArray = arrayOutputStream.toByteArray();//[0, 0, 0, 101, 0, 0, 0, 21]
        
        System.out.println(Arrays.toString(byteArray));
        
        //字节数组转换为int
        ByteArrayInputStream arrayInputStream = new ByteArrayInputStream(byteArray);
        byte[] idBytes = new byte[4];//id占4个字节
        arrayInputStream.read(idBytes);
        System.out.println("id:" + bytes2int(idBytes));//id:101
        
        byte[] ageBytes = new byte[4];
        arrayInputStream.read(ageBytes);//age占4个字节
        System.out.println("age:" + bytes2int(ageBytes));//age:21
        
    }
    
    
    /**
     int转换成字节数组,使用的是大端序列方式。
     2种方式:
     1.大端字节序列:先写高位,再写低位
     2.小端字节序列:先写低位,再写高位
     */
    public static byte[] int2bytes(int i){
        byte[] bytes = new byte[4];  //int占4个字节
        bytes[0] = (byte)(i >> 3*8);//先获取高位,总共4个字节,向右移动3个字节,一个字节8位,
        bytes[1] = (byte)(i >> 2*8);
        bytes[2] = (byte)(i >> 1*8);
        bytes[3] = (byte)(i >> 0*8);
        return bytes;//[0, 0, 0, 101],[0, 0, 0, 21]
    }
    
    
    /**
     * 把字节数组转换为int。
     * int转换为字节数组时候bytes[0]是高位,向左移动3个字节,
     * 
     * 大端序列方式:
     */
    public static int bytes2int(byte[] bytes){
        return (bytes[0] << 3*8) |
                (bytes[1] << 2*8) |
                (bytes[2] << 1*8) |
                (bytes[3] << 0*8);
    }
}
package com.cn;

import java.nio.ByteBuffer;
import java.util.Arrays;

public class Test2 {

    public static void main(String[] args) {
        int id = 101;
        int age = 21;
        
        //序列化
        //nio里面的ByteBuffer,申请8个空间,必须给定指定的大小,不会自动扩容。再写数据就会报错超出容量。
        ByteBuffer buffer = ByteBuffer.allocate(8);
        buffer.putInt(id);
        buffer.putInt(age);
        byte[] array = buffer.array();
        System.out.println(Arrays.toString(buffer.array()));//[0, 0, 0, 101, 0, 0, 0, 21]
        
        //反序列化
        ByteBuffer buffer2 = ByteBuffer.wrap(array);
        System.out.println("id:"+buffer2.getInt());//先写的是id
        System.out.println("age:"+buffer2.getInt());//后写的是age
        //id:101,age:21
    }

}
package com.cn;

import java.util.Arrays;

import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;

public class Test3 {
    public static void main(String[] args) {

        //netty里面的ChannelBuffer,封装了ByteBuffer,可以自动扩容。
        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
        buffer.writeInt(101);
        buffer.writeDouble(80.1);

        byte[] bytes = new byte[buffer.writerIndex()];//大小根据ChannelBuffer的写指针决定。
        buffer.readBytes(bytes);
        
        System.out.println(Arrays.toString(bytes));//[0, 0, 0, 101, 64, 84, 6, 102, 102, 102, 102, 102]
        System.out.println("abc".getBytes());//[B@29453f44
        
        //
        ChannelBuffer wrappedBuffer = ChannelBuffers.wrappedBuffer(bytes);//传一个字节数组
        System.out.println(wrappedBuffer.readInt());
        System.out.println(wrappedBuffer.readDouble());
        
    }

}

 

转载于:https://www.cnblogs.com/yaowen/p/9056506.html

相关文章:

  • Loadrunner解决启动浏览器后页面显示空白
  • 将.py文件转换成.exe文件
  • Linux服务器系统安全
  • 分布式之数据库和缓存双写一致性方案解析
  • 【NOIP2008】【Vijos1493】传纸条
  • Mac 如何安装 chromedriver
  • UPC-2249 曲线分割【递推】
  • postman接口测试:登录
  • Flannel - 原理
  • cpp
  • JS基础:常用API
  • LeetCode——18. 4Sum
  • resetlogs报错 ORA-00392
  • iOS项目中group和folder的区别
  • nginx资源争夺问题
  • 网络传输文件的问题
  • [译] 怎样写一个基础的编译器
  • 【笔记】你不知道的JS读书笔记——Promise
  • 2017前端实习生面试总结
  • cookie和session
  • IOS评论框不贴底(ios12新bug)
  • leetcode46 Permutation 排列组合
  • mysql 5.6 原生Online DDL解析
  • Redis中的lru算法实现
  • session共享问题解决方案
  • 读懂package.json -- 依赖管理
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 后端_MYSQL
  • 基于遗传算法的优化问题求解
  • 计算机常识 - 收藏集 - 掘金
  • 详解NodeJs流之一
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 优化 Vue 项目编译文件大小
  • python最赚钱的4个方向,你最心动的是哪个?
  • 阿里云移动端播放器高级功能介绍
  • (06)Hive——正则表达式
  • (Java数据结构)ArrayList
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (初研) Sentence-embedding fine-tune notebook
  • (独孤九剑)--文件系统
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)springboot教学评价 毕业设计 641310
  • (十)c52学习之旅-定时器实验
  • (五)c52学习之旅-静态数码管
  • (转)德国人的记事本
  • (转)一些感悟
  • .net 简单实现MD5
  • .NET 设计一套高性能的弱事件机制
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .NET性能优化(文摘)
  • .NET与 java通用的3DES加密解密方法
  • @PreAuthorize注解
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务