Netty序列化之Jboss Marshalling

JBoss Marshalling 序列化技术 编解码器使用 netty 实例 环境准备 maven 依赖 项目结构 编码与介绍 功能介绍 & 实现效果 服务端开发 客户端开发 Marshalling 编解码器工厂类 & pojo 粘包拆包思考 遇到的坑 Marshalling 的jar 版本小于2 pojo类要实现Serializable接口 JBoss Marshalling 是一个 Java 对象序列... 阅读详情

 

 

距离上一篇Netty的文章已经一个星期了,哈哈哈。周末学习了一下关于序列化的,先做个笔记先。

Java序列化,就那么两个目的,第一是进行网络传输,第二就是对象持久化到磁盘。虽然在Netty传输中我们可以继续使用Java进行对象序列化,但是Java序列化的硬伤太多了。比如无法跨语言,序列后码流太大,序列化性能太低等等。

现在主流的编解码框架有:

   JBoss的Marshalling包

   google的Protobuf

   基于Protobuf的Kyro

   MessagePack框架

下面呢,我们将用到的是JBoss的Marshalling包。Jboss Marshalling是一个Java对象序列化包,但是呢,对JDK默认的序列化框架进行了优化,但又保持跟java.io.Serializable接口的兼容,同时增加了一些可调的参数和附加特性。

类库:jboss-marshalling-1.3.0、jboss-marshalling-serial-1.3.0

下载地址:https://www.jboss.org/jbossmarshalling/downloads

JbossMarshalling与Netty结合后进行序列化对象的代码编写非常的简单,我们下面看一下例子代码: 

 

其实代码和之前的例子是差不多的,只是添加的编解码器变了,发送和接收数据的逻辑也变了,变为直接将msg转为POJO。最重要的是自己创建的根据Jboss Marshalling编写编解码器。

下面直接上例子:

Server:
 

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.logging.LoggingHandler;

public class Server{

public static void main(String[] args) throws InterruptedException {

    //1、创建一个线程组来处理服务器接收客户端连接
    EventLoopGroup bossGroup = new NioEventLoopGroup();

    //2、创建一个线程组来进行网络通信
    EventLoopGroup workGroup = new NioEventLoopGroup();

    //3、创建辅助工具类Bootstrap,用于服务端通道的配置
    ServerBootstrap sb = new ServerBootstrap();
    sb.group(bossGroup, workGroup)
        .handler(new LoggingHandler()) //设置日志
        .channel(NioServerSocketChannel.class) //指定NIO模式
        .option(ChannelOption.SO_BACKLOG, 1014) //设置tcp缓冲区大小
        .option(ChannelOption.SO_SNDBUF, 32*1024) //设置发送缓冲区大小
        .option(ChannelOption.SO_RCVBUF,32*1024) //设置接收缓冲区大小
        .option(ChannelOption.SO_KEEPALIVE, true) //保持连接(长连接)
        .childHandler(new ChannelInitializer<SocketChannel>() {

            @Override
            protected void initChannel(SocketChannel ch) throws Exception {

            //添加mashalling的编解码
            ch.pipeline().addLast(MarshallingCodeFactory.buildMarshallingEncoder());
            ch.pipeline().addLast(MarshallingCodeFactory.buildMarshallingDecoder());
            ch.pipeline().addLast(new ServerHandler()); //配置具体的数据处理类
            }

        });

    ChannelFuture f = sb.bind(9876).sync(); //绑定端口,客户端连接需要知道端口

    //异步等待关闭(记得不是close()方法) 
    f.channel().closeFuture().sync();

    //当通道关闭后,将线程组也关闭
    bossGroup.shutdownGracefully();
    workGroup.shutdownGracefully();
    }

}

ServerHandler:继承ChannelHandlerAdapter

import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;

public class ServerHandler extends ChannelHandlerAdapter{

    @Override

    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {

        //因为有marshalling编解码器,所以可以直接将msg强转为RequestEntity
        RequestEntity entity = (RequestEntity)msg;
        System.out.println(entity.getId()+" "+entity.getName());
        ResponseEntity response = new ResponseEntity(entity.getId(),                                 "server"+entity.getId());
        ctx.writeAndFlush(response);

}

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws     Exception {
        cause.printStackTrace();
        ctx.close(); //出现异常的话就关闭
    }
}

Client:

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;

public class Client {

public static void main(String[] args) throws InterruptedException {
    //和服务端不一样,客户端只需要一个线程组来处理网络通信即可
    EventLoopGroup workGroup = new NioEventLoopGroup();
    //创建辅助类,和服务器的不一样,服务端的是ServerBootStrap,而客户端的是BootStrap
    Bootstrap bs = new Bootstrap();
    bs.group(workGroup)
    .channel(NioSocketChannel.class) //设置tcp缓冲区大小
    .handler(new ChannelInitializer<SocketChannel>() {

        @Override
        protected void initChannel(SocketChannel ch) throws Exception {
        
        //添加mashalling的编解码
        ch.pipeline().addLast(MarshallingCodeFactory.buildMarshallingEncoder());
        ch.pipeline().addLast(MarshallingCodeFactory.buildMarshallingDecoder());
        ch.pipeline().addLast(new ClientHandler());
        }
    });

    //连接服务端
    ChannelFuture cf = bs.connect("127.0.0.1", 9876).sync();
    //给服务端写数据
    for(int i=0;i<10;i++){
        RequestEntity entity = new RequestEntity(Integer.toString(i), "Client"+i);
        cf.channel().writeAndFlush(entity);
    }

    //异步监听管道的关闭,如果关闭了就往下执行
    cf.channel().closeFuture().sync();
    workGroup.shutdownGracefully();
    }
}

ClientHandler:

import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;
import io.netty.util.ReferenceCountUtil;

public class ClientHandler extends ChannelHandlerAdapter{

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        //直接将msg强转为ResponseEntity
        ResponseEntity entity = (ResponseEntity) msg;
        System.out.println(entity.getId()+" "+entity.getName());
        //最后如果没有回写记得释放
        ReferenceCountUtil.release(msg);
}

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception{
        cause.printStackTrace();
        ctx.close();
    }
}

Marshlling工厂:可以创建Marshalling编解码器(这个是重点,以后都可以直接当工具类拿来用)

import org.jboss.marshalling.MarshallerFactory;
import org.jboss.marshalling.Marshalling;
import org.jboss.marshalling.MarshallingConfiguration;
import io.netty.handler.codec.marshalling.DefaultMarshallerProvider;
import io.netty.handler.codec.marshalling.DefaultUnmarshallerProvider;
import io.netty.handler.codec.marshalling.MarshallerProvider;
import io.netty.handler.codec.marshalling.MarshallingDecoder;
import io.netty.handler.codec.marshalling.MarshallingEncoder;
import io.netty.handler.codec.marshalling.UnmarshallerProvider;

public class MarshallingCodeFactory {

    /**
    * 创建Jboss Marshalling解码器MarshallingDecoder
    * @return MarshallingDecoder
    */
    public static MarshallingDecoder buildMarshallingDecoder(){

        //首先通过Marshalling工具类的静态方法获取Marshalling实例对象 参数为serial标识创建的是java序列化工厂对象
        final MarshallerFactory marshallerFactory =         Marshalling.getProvidedMarshallerFactory("serial");

        //创建MarshallingConfiguration对象,配置版本号为5
        final MarshallingConfiguration configuration = new MarshallingConfiguration();
configuration.setVersion(5);

        //根据marshallerFactory和configuration创建provider
        UnmarshallerProvider provider = new DefaultUnmarshallerProvider(marshallerFactory, configuration);

        //构建Netty的marshallingDecoder对象,两个参数分别为provider和单个消息序列化后的最大长度
        MarshallingDecoder decoder = new MarshallingDecoder(provider, 1024*1024*1);
    
        return decoder;
}

    /**
    * 创建Jboss Marshalling编码器MarshallingEncoder
    * @return MarshallingDecoder
    */
    public static MarshallingEncoder buildMarshallingEncoder(){

        //首先通过Marshalling工具类的静态方法获取Marshalling实例对象 参数为serial标识创建的是java序列化工厂对象
        final MarshallerFactory marshallerFactory = Marshalling.getProvidedMarshallerFactory("serial");

        //创建MarshallingConfiguration对象,配置版本号为5
        final MarshallingConfiguration configuration = new MarshallingConfiguration();
configuration.setVersion(5);

        //根据marshallerFactory和configuration创建provider
        MarshallerProvider provider = new DefaultMarshallerProvider(marshallerFactory, configuration);

        //构建Netty的marshallingDecoder对象,用于将实现序列化接口的POJO对象序列化成二进制数组
        MarshallingEncoder encoder = new MarshallingEncoder(provider);

        return encoder;
    }
}

请求实体类和响应实体类:记得一定要实现serializable接口

import java.io.Serializable;

public class RequestEntity implements Serializable{
    
    private static final long serialVersionUID = 1L;
    private String id;
    private String name;

    public RequestEntity(String id, String name) {
        super();
        this.id = id;
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

package com.demo.testNetty.tcp.serial;

import java.io.Serializable;

public class ResponseEntity implements Serializable{

    private static final long serialVersionUID = 1L;
    private String id;
    private String name;

    public ResponseEntity(String id, String name) {

        super();
        this.id = id;
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

不过需要注意的是,现在是服务端和客户端都是同一个项目,正常来说可能客户端和服务端是同的项目,不同的服务器,那么我们需要知道,请求和响应实体类在两个端的名字和包路径一定要一模一样,不然是会通信出错的。这就好像自定义消息体一样,双方要协定好,双方都要遵循这个自定义协议才能通信成功。

上面的POJO只是简单的基本类型属性,那么如果要传输文件呢。这时候我们可以加上字节数组的属性,但是需要注意的是,传输之前,发送的一方一定要压缩,然后接收的那一方记得要解压缩。

那么我们先看一下解压缩的工具类:它用到的是JDK自带的解压缩流。

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;


public class GzipUtil {

    public static byte[] gzip(byte[] data) throws Exception{

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        GZIPOutputStream gzip = new GZIPOutputStream(bos);
        gzip.write(data); //将解压后的数据写到bos里面
        gzip.flush();
        gzip.close();
        byte[] result = bos.toByteArray(); //将bos里面的数据转为字节数组
        bos.close();
        return result;

    }

    public static byte[] ungzip(byte[] data) throws Exception{

        ByteArrayInputStream bis = new ByteArrayInputStream(data);
        GZIPInputStream gzip = new GZIPInputStream(bis); //将数据放进gzip
        byte[] buf = new byte[1024];
        int num = -1;
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        while((num = gzip.read(buf, 0, buf.length)) != -1){ //每次从gzip中读一个字节的数据
            bos.write(buf,0,num); //将读取的数据放进bos中
       }
        gzip.close();
        bis.close();
        byte[] result = bos.toByteArray(); //将bos里面的数据转为字节数组
        bos.flush();
        bos.close();
        return result;
    }

public static void main(String[] args) throws Exception {

    //读取文件
    //System.getProperty可以获取当前系统信息,这里的user.dir表示当前路径
    //File.separatorChar表示文件的分隔符,兼容各种操作系统
    String filepath =     System.getProperty("user.dir")+File.separatorChar+"lib"+File.separatorChar+"sigar.jar";
    File file = new File(filepath);
    FileInputStream fis = new FileInputStream(file);
    byte[] data = new byte[fis.available()];
    fis.read(data); //将数据读到字节数组
    fis.close();
    System.out.println("文件的原始的大小为:"+data.length);

    //进行压缩
    byte[] result1 = gzip(data);
    System.out.println("压缩后的大小:"+result1.length);

    //解压缩
    byte[] result2 = ungzip(result1);
    System.out.println("解压缩后的大小"+result2.length);
    
    //写出文件
    String path =     System.getProperty("user.dir")+File.separatorChar+"lib"+File.separatorChar+"sigar2.jar";
    FileOutputStream fos = new FileOutputStream(path);
    fos.write(result2);
    fos.close();
    }
}

好了,现在我们将进行测试一下。

第一,在RequestEntity加上字节数组来存放文件字节数据

private byte[] attachment;

第二,修改客户端给服务端写数据的代码:

String id = "1";
String name = "客户端发送的数据";

//将压缩后的字节数组也放进实体中
String filePath = System.getProperty("user.dir")+File.separatorChar+"lib"+File.separatorChar+"sigar.jar";
FileInputStream fis = new FileInputStream(new File(filePath));
byte[] data = new byte[fis.available()];
fis.read(data);
fis.close();
//记得进行压缩
byte[] result = GzipUtil.gzip(data);
RequestEntity entity = new RequestEntity(id, name);
entity.setAttachment(result);
cf.channel().writeAndFlush(entity); //往服务端里头写

第三,修改服务端Handler接收数据的逻辑:

//因为有marshalling编解码器,所以可以直接将msg强转为RequestEntity
RequestEntity entity = (RequestEntity)msg;
System.out.println(entity.getId()+" "+entity.getName());
//将文件的字节数组拿出来,然后写出来
byte[] data = entity.getAttachment();
//记得进行解压缩
byte[] result = GzipUtil.ungzip(data);
String filePath = System.getProperty("user.dir")+File.separatorChar+"recive"+File.separatorChar+"test.jar";
//将文件写回项目中
FileOutputStream fos = new FileOutputStream(new File(filePath));
fos.write(result);
fos.close();
ResponseEntity response = new ResponseEntity(entity.getId(), "server"+entity.getId());
ctx.writeAndFlush(response);

结果:最后确实成功了。

 

Netty对JBoss Marshalling序列化的解决粘包/半包问题的编解码方案 解码工具:MarshallingDecoder 编码工具:MarshallingEncoder 代码 1.MarshallingSerializeServer:服务器 /** * @author pdc */ public class MarshallingSerializeServer { public void bind(int port) throws Exception ... 阅读详情

相关推荐

Demo2Reward:用人类演示动态优化VLM奖励模型提示

多模态大模型(VLM)的奖励建模正面临核心瓶颈——静态提示导致语义鸿沟与泛化失效。其本质是将人类判断标准固化为不可更新的文本模板,使奖励信号脱离真实任务意图。Demo2Reward提出范式级改进:以结构化人类演示为元信号,驱动提示权重连续优化,实现从‘结果打分’到‘过程理解’的跃迁。该方法不修改VLM主干,却显著提升RLHF收敛效率与OOD鲁棒性,在医疗、工业质检等场景验证了跨任务迁移与热修复能力。它重新定义了提示工程的技术价值:不是前端微调,而是奖励系统的认知校准基础设施。

weixin_34302798的博客 408

netty编解码之jboss marshalling

netty编解码之jboss marshallingjboss marshalling是jboss内部的一个序列化框架,速度也十分快,这里netty也提供了支持,使用十分方便,不需要像protobuf一样编写proto文件,只需要提供两个编解码器即可,以下就是jboss marshalling使用的开始。源码程序model类model类和之前编写java序列化的时候没有区别,这里便不再多说,仅仅贴出

u012734441的专栏 3956

浅谈车联网概述-1

车联网技术目前在车企中应用广泛,车联网通过车载传感器、无线通信等技术,能够将车辆上百的传感器数据上传至云端,当前智能网联车辆可以理解为一个“大号”手机。

Hello, World! 新能源汽车智能网联工程师,分享日常工作思考。 560

netty系列之:使用Jboss Marshalling来序列化java对象

在JAVA程序中经常会用到序列化的场景,除了JDK自身提供的Serializable之外,还有一些第三方的产品可以实现对JAVA对象的序列化。其中比较有名的就是Google protobuf。当然,也有其他的比较出名的序列化工具,比如Kryo和JBoss Marshalling。 今天想给大家介绍的就是JBoss Marshalling,为什么要介绍JBoss Marshalling呢? 用过google protobuf的朋友可能都知道,虽然protobuf好用,但是需要先定义序列化对象的结构才能生成

weixin_68320784的博客 842

DQN网络代码调用env.reset()后存储观测信息报错问题ValueError: setting an array element with a sequence.解决处理

**reset()函数返回的是一个array类型以及其中数据的type!模拟游戏进行学习任务。因此需要将observation指定为真正需要的array信息即可,得到的的变量observation类型与Agent存储时的。因此怀疑返回的observation有问题,于是通过。报错信息提示为数据维度不对应,也即最初通过。在强化学习DQN网络代码实现过程中,针对。

Vulcan_Q的博客 4093

DeepSeek提示词实战:从零到百的AI角色扮演指南(附100+场景模板)

本文提供了一份详尽的DeepSeek提示词实战指南,重点讲解AI角色扮演的核心技巧。通过“角色扮演四要素法”和五大核心场景模板,帮助用户从零开始掌握如何设计高质量提示词,有效提升AI输出的深度与精度,并附赠100+实用场景模板供参考。

weixin_29305337的博客 582

JBoss Marshalling编解码

一、简介 JBoss Marshalling是一个Java对象序列化包,对JDK默认的序列化框架进行了优化,但又保持和java.io.Serializable接口的兼容。 二、Marshalling开发环境准备 1、下载类库 由于只涉及到Marshalling的序列化类库,因此只需要下载jboss-marshalling-1.3.0.CR9.jar和jboss-marshalling-se...

Terisadeng的博客 1719

信捷XDH PLC多轴运动控制实战:Ethercat总线下的C语言封装技巧

本文深入探讨了在信捷XDH PLC平台上,如何利用C语言对EtherCAT总线多轴运动控制进行高效封装。通过设计全局数据池、模块化状态机及用户友好接口,将底层复杂的运动控制函数库抽象为清晰、可复用的高级模块,显著提升程序稳定性与可维护性,并分享了关键的实战避坑经验。

weixin_29188043的博客 160

netty: 编解码之jboss marshalling, 用marshalling进行对象传输

jboss marshalling是jboss内部的一个序列化框架,速度也十分快,这里netty也提供了支持,使用十分方便。 TCP在网络通讯的时候,通常在解决TCP粘包、拆包问题的时候,一般会用以下几种方式:   1、消息定长 例如每个报文的大小固定为200个字节,如果不够,空位补空格;   2、在消息尾部添加特殊字符进行分割,如添加回车;   3、将消息分为消息体和消息...

weixin_30301449的博客 283

ESP32网络开发实例-开发环境搭建

NodeMCU-ESP-32S开发环境搭建 NodeMCU-32S 最强的ESP32 开发板非盗版或副厂的CH340。WiFi 蓝牙ESP-32 可用Arduino IDE ESP32-S 是一款通用型WiFi-BT-BLE MCU模组,功能强大,用途广泛,可以用于低功耗传感器网络和要求极高的任务,例如语音编码、音频流和MP3解码等。 此款模组的核心是ESP32芯片,具有可扩展、自适应的特点。两个CPU核可以被单独控制或上电。时钟频率的调节范围为80 MHz到240 MHz。用户可以切断CPU的电源,利用低

视觉与物联智能 3781

在 ABAP CDS View 里把 Conversion Functions 用到极致:FLTP 精度、单位换算、货币换算与小数位处理的工程化实践

数据格式转换在真实项目中比业务逻辑更容易引发问题。ABAP CDS中的转换函数(如FLTP_TO_DEC、UNIT_CONVERSION、CURRENCY_CONVERSION和DECIMAL_SHIFT)可帮助在数据库层统一数据口径,避免应用层重复处理。这些函数支持数值精度治理、单位换算、货币转换和小数位调整,能显著提升报表性能并减少逻辑分散。通过将格式转换前移到数据模型层,可以确保服务层和UI层的数据一致性,同时降低接口传输错误风险。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2351

Netty中粘包和拆包的解决方案

Netty中粘包和拆包的解决方案

woaiwojialanxi的专栏 1899

全网最全RT-DETR涨点改进,基于官方源码1:1还原,在Ultralytics项目中配置rtdetr-r18、rtdetr-r34、rtdetr-r50、rtdetr-r101版本~小论文大论文必备

本文详细介绍了如何将RT-DETR的ResNet18/34/50/101/154版本移植到ultralytics项目中。主要内容包括:1) RT-DETR核心特点,如高效混合编码器、IoU感知查询选择等;2) 提供完整ResNet核心代码;3) 分步配置指南,包括创建模块文件和修改tasks.py;4) 各版本yaml配置文件的创建方法。该方案可帮助研究者快速实现RT-DETR改进,适用于目标检测相关论文研究。所有配置文件均可正常运行,为实验部署提供了便利。

Ai缝合怪、助力小伙伴高效发论文 3932

netty使用jboss的Marshalling编解码(对象序列化)

首选映入netty-all-5.0.0.Alpha2.jar  jboss-marshalling-serial-1.3.0.CR9.jar  jboss-marshalling-1.3.0.CR9.jar 包 /**  * 客户端  */ public class Client { //内部类的懒加载 private static class SingletonHolder {

不断总结不断成长 1297

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

《Netty权威指南》之JBoss序列化框架Marshalling

前面讲了netty解决拆包粘包的问题 我们发现拆包粘包问题的解决都只是解决netty发送字符串的情况 在企业及开发中很少有直接使用字符串的,一般都有定义好的消息体,这个消息体一定对应实体类 如果要传送实体类那么久一定要对实体类做序列化 (序列化就是把文件或者内存中的数据结构转换为字节数组以便存储或在网路传输) 今天就介绍一下jboss的marshalling序列化框架 下面文章是听了白老师的N...

凌夜知惜 574

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Netty传输POJO(使用JBoss的Marshalling序列化方式)

Netty传输POJO(使用JBoss的Marshalling序列化方式)

woaiwojialanxi的专栏 523

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Netty之传输POJO(使用JBoss的Marshalling序列化方式)

1、关于JBOSS的Marshalling的简介        JBoss Marshalling 是一个Java对象的序列化API包,修正了JDK自带的序列化包的很多问题,但又保持跟 java.io.Serializable 接口的兼容;同时增加了一些可调的参数和附加的特性,而这些参数和特性可通过工厂类进行配置。 2、关于JBoss的Marshalling的配置       2.1

Learning 5330

Happy Netty5 序列化方式(Jboss Marshalling)

Netty作为很多高性能的底层通讯工具,被很多开发框架应用再底层,今天来说说常用的序列化工具,用Jboss的Marshalling。直接上代码,Marshalling的工厂类packagecom.netty.serialize.marshalling; importio.netty.handler.codec.marshalling.*; importorg.jbos...

weixin_33713707的博客 146

Netty5+Jboss(Marshalling)完成对象序列化传输

  TCP在网络通讯的时候,通常在解决TCP粘包、拆包问题的时候,一般会用以下几种方式:   1、 消息定长 例如每个报文的大小固定为200个字节,如果不够,空位补空格;   2、 在消息尾部添加特殊字符进行分割,如添加回车;   3、 将消息分为消息体和消息头,在消息头里面包含表示消息长度的字段,然后进行业务逻辑的处理。   在Netty中我们主要利用对象的序列化进行对象的传输,虽然Java本身...

weixin_34380296的博客 189

Netty之Marshalling编解码

Netty主流的编解码器: ①JBoss的Marshalling包 ②google的Protobuf ③基于Protobuf的Kyro ④Apache的Thrift 本篇博客主要介绍Netty基于Marshalling的最简单的代码实践 实现引入依赖 <dependency> <groupId>io.netty</groupId> &l...

猎户星座 365

编解码-marshalling

JBoss的Marshalling序列化框架,它是JBoss内部使用的序列化框架,Netty提供了Marshalling编码和解码器,方便用户在Netty中使用Marshalling。 JBoss Marshalling是一个Java对象序列化包,对JDK默认的序列化框架进行了优化,但又保持跟java.io.Serializable接口的兼容,同时增加了一些可调的参数和附加的特性,这些参数...

一条宝鱼的专栏 1233

Java网络编程(7) - 什么是TCP粘包、拆包和解决?什么Netty编解码技术?主流的序列化框架有哪些?Netty的JBOSS的Marshalling详解案例?

TCP粘包、拆包问题 熟悉TCP编程的可能都知道,无论是服务端还是客户端,当进行数据读取或者发送数据的时候,都需要考虑TCP底层的粘包和拆包机制的问题。 TCP是一个流协议,流是没有界限的数据,是连成一片的,没有分界线。TCP底层并不理解上层的业务数据具体的含义,它会根据TCP缓冲区的实际情况进行包的划分,也就是说,在业务上,一个完整的包可能会被TCP分成多个包进行发送,也可能把多个小包封装成一个大的数据包发送出去,这就是所谓的TCP粘包、拆包问题。 TCP粘包和拆包 -...

Su_Levi_Wei的博客 527

jboss marshell序列化整合netty

1、关于JBOSS的Marshalling的简介        JBoss Marshalling 是一个Java对象的序列化API包,修正了JDK自带的序列化包的很多问题,但又保持跟 java.io.Serializable 接口的兼容;同时增加了一些可调的参数和附加的特性,而这些参数和特性可通过工厂类进行配置。 2、关于JBoss的Marshalling的配置    

七月流星 454

netty学习之路四,利用Marshalling序列化对象,传输

利用Marshalling序列化对象pom依赖ServerServerHandlerClientClientHandler实体类response和requestMarshalling工厂类 pom依赖 &lt;dependency&gt; &lt;groupId&gt;io.netty&lt;/groupId&gt; &lt;artifactId&gt...

jjkang的博客 651
上一篇: 关于表单序列化的三种方法:
下一篇: Netty的数据通信场景(实用)
Howinfun
博客等级 码龄10年 165粉丝 213原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值