java序列化实现RMI

Java RMI详解 阅读详情

RMI(Remote Method Invocation)是Java中的远程过程调用(Remote Procedure Call,RPC)实现,是一种分布式Java应用的实现方式。它的目的在于对开发人员屏蔽横跨不同JVM和网络连接等细节,使得分布在不同JVM上的对象像是存在于一个统一的JVM中一样,可以很方便的互相通讯。通讯就涉及到了数据的编码和解码,对于一般的数据类型我们不需要这么做,但是涉及到比较复杂的数据类型,例如对象,RMI利用到了序列化,使得数据的编码与解码对于开发人员透明起来,我们不需要关注数据如何传输,只需要实现相关方法就能做到远程调用。

一、序列化

对象的序列化主要是使用JAVA中的ObjectOutputStream的writeObject(Object obj)来序列化和ObjectInputStream的readObject()来反序列化。
1、在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存。比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等要用了,再把保存在硬盘中的对象还原到内存中。当然目前大多数项目存储会员状态信息都会用到Memcached。
2、当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。此处RMI就利用了这点来帮我们编排对象数据信息。

总结就有如下优点:

  • 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中。
  • 便于在网络上传送对象的字节序列。
package rmiTest;

import java.io.Serializable;

public class Person implements Serializable{

    private static final long serialVersionUID = -6379887343250921447L;

    private int id;
    private String name;
    private String sex;

    public Person(){}

    public Person(int id, String name, String sex) {
        super();
        this.id = id;
        this.name = name;
        this.sex = sex;
    }
    //getXx();
    //setXx();
}

   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
package serializeTest;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import rmiTest.Person;

public class TestObjSerializeAndDeserialize {

    public static void main(String[] args) {
        Person person = new Person(1, "丁烁", "man");
        try {
            serialize(person, "E:/ds.txt");
            deserialize("E:/ds.txt");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //序列化
    public static void serialize(Object object, String path) throws Exception{
        ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(path));
        outputStream.writeObject(object);
        outputStream.flush();
        outputStream.close();
        System.out.println("序列化成功!");
    }
    //反序列化
    public static void deserialize(String path) throws Exception{
        ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(path));
        Person person =(Person) inputStream.readObject();
        inputStream.close();
        System.out.println("反序列化成功!");
        System.out.println("id:"+person.getId());
        System.out.println("name:"+person.getName());
        System.out.println("sex:"+person.getSex());
    }

}

   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

输出结果:
结果输出
文件生成:
生成的文件

注意事项:实体类上必须实现序列化接口,并且设定一个serialVersionUID。如果没有添加该字段,序列化对象之后,修改实体类再进行反序列化就会报错。java编译器会自动给这个class进行一个摘要算法来生成serialVersionUID,只要这个文件多一个空格,得到的serialVersionUID就会截然不同。所以修改之后java编译器又给我们生成了一个serialVersionUID,反序列化时两个版本号不一致就会报错。

二、jar命令

jar(Java archive file),这里为了更加真实的模拟远程接口调用,我们使用一个简单的面向接口编程,包含一个客户端和一个服务端。服务端包含了接口、实现以及实体类,客户端引入接口以及实体类的jar包,通过远程接口调用来调用接口的实现类。所以简要的梳理一下如何使用jar命令来进行打包相关类文件。当然在实际的项目中会使用maven来构建jar工程。

举例:
jar cvf d:\rmitest.jar D:\workspace\tjfae-v2300-20160410\appTest\bin\rmiTest
该命令会将rmiTest下的所有文件打包成jar并命名为rmitest.jar存放与d盘下。当然也可以指定多个目录、多个类文件。但是这样有一个弊端,我们打出的jar并不是按照我们所想的package目录打出来的。我们反编译一个jar如下图:
这里写图片描述
jar里面的类文件路径是按照我们打包时的路径所写,这样会导致我们在引用这个jar包时,报路径错误。明白了这点,我们可以将dos下的当前目录调整到与package对应位置,再执行打包命令。先将dos路径调整到D:\workspace\tjfae-v2300-20160410\appTest\bin下,然后执行如下命令:
jar cvf d:\rmitest.jar rmiTest
这里写图片描述

此时就已经打出了我们想要的jar包,为后面的远程接口调用做准备。

三、RMI远程调用实例

前面介绍了序列化和如何利用jar命令打包,下面的例子分为客户端和服务器端,服务器端包含了接口和接口的实现,并且将实现注册到一个服务地址上。然后用jar命令将服务器端的接口和实体类打包,在客户端引用,这样客户端只有接口,而不会看到具体实现。这里为了方便,将接口和实现放在同一个工程。但是更好方式是:

  1. 将接口写在一个工程A;
  2. 将工程A打成jar包;
  3. 在工程B中引入工程A的jar包,实现这些接口并注册服务,工程B即服务端;
  4. 在工程C中引入工程A的jar包,获取服务并注入给相应接口,工程C即客户端;
  5. 客户端远程调用。

本例中涉及到的类文件如下:
服务端:
Person:实体类,实现Serializable进行序列化;
PersonService:服务接口,继承Remote;
PersonServiceImp:服务实现,继承UnicastRemoteObject,并且实现PersonService;
ServerTest:注册PersonService这个服务;
客户端:
引入事先打好的jar包(Person.class、PersonService.class)
ClientTest:调用远程服务。

Person上面已经贴出。
PersonService包含一个getPerson的抽象方法。

package rmiTest;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface PersonService extends Remote {

    public Person getPerson() throws RemoteException;

}

   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

PersonServiceImp必须要继承UnicastRemoteObject,如果不继承这个类,那么客户端每次lookup出来的都是不一样的对象,可以通过在服务端添加一个成员变量,每调用一次自增一下来进行测试,这里不做多余讲解。

package rmiTest;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class PersonServiceImp extends UnicastRemoteObject implements PersonService {

    private static final long serialVersionUID = 1L;

    protected PersonServiceImp() throws RemoteException {
        super();
    }

    @Override
    public Person getPerson() throws RemoteException {
        Person person = new Person();
        person.setId(1);
        person.setName("ds");
        person.setSex("M");
        return person;
    }

}

   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

ServerTest服务端注册这个服务

package rmiTest;

import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;

public class ServerTest {

    public static void main(String[] arg){
        try {
            PersonService personService = new PersonServiceImp();
            LocateRegistry.createRegistry(6600);
            Naming.bind("rmi://127.0.0.1:6600/PersonService", personService);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

ClientTest客户端进行远程调用,客户端要先引入事先打好的jar包


import java.rmi.Naming;

import rmiTest.Person;
import rmiTest.PersonService;

public class ClientTest {

    public static void main(String[] args) {
        try {
            PersonService personService = (PersonService) Naming.lookup("rmi://127.0.0.1:6600/PersonService");
            Person person = personService.getPerson();
            System.out.println("ID:"+person.getId());
            System.out.println("Name:"+person.getName());
            System.out.println("Sex:"+person.getSex());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
(function () {('pre.prettyprint code').each(function () { var lines = (this).text().split(′\n′).length;var numbering = $('
    ').addClass('pre-numbering').hide(); (this).addClass(′has−numbering′).parent().append( numbering); for (i = 1; i
    组合导航(八):INS/GPS组合导航 INS/GPS组合导航1 误差反馈1.1 开环INS/GPS架构1.2 闭环INS/GPS架构2 组合导航的类型2.1 松耦合 的INS/GPS组合导航2.2 紧耦合 的INS/GPS组合导航2.3 深度耦合的 INS/GPS组合导航3 INS方程的动态误差模型4 松耦合的INS/GPS组合导航模型4.1 系统模型4.2 测量模型4.3 INS/GPS松耦合总框图5 紧耦合的INS/GPS组合导航模型5.1 系统模型5.2 测量模型 INS/GPS组合导航 对比INS与GPS导航方法,二者都有其各自的优. 阅读详情

    相关推荐

    从零构建虚幻引擎体积云:参数调优与性能平衡的艺术

    本文深入探讨了在虚幻引擎中构建逼真体积云系统的关键技术,包括Sky Atmosphere、Volumetric Cloud和Exponential Height Fog三大核心组件的协同工作。重点解析了体积云材质的高级控制、光照阴影的物理模拟以及性能优化策略,帮助开发者在视觉效果与性能之间找到最佳平衡点。

    weixin_29012677的博客 938

    JAVA序列化之RMI远程调用

    RMI(Remote Method Invocation)是Java中的远程过程调用(Remote Procedure Call,RPC)实现,是一种分布式Java应用的实现方式。它的目的在于对开发人员屏蔽横跨不同JVM和网络连接等细节,使得分布在不同JVM上的对象像是存在于一个统一的JVM中一样,可以很方便的互相通讯。通讯就涉及到了数据的编码和解码,对于一般的数据类型我们不需要这么做,但是涉及到比

    开心的专栏 5418

    MiniMax H3本地部署与ComfyUI集成实战:从环境配置到提示词优化

    文本到视频生成是AI内容创作领域的关键技术,它基于扩散模型等深度学习原理,将自然语言描述转化为连贯的动态视觉序列。这项技术的核心价值在于大幅降低了视频制作的门槛,为短视频创作、概念可视化、教育内容生成等场景提供了高效工具。在实际工程实践中,成功部署和运行此类模型,如近期备受关注的MiniMax H3,需要精准处理环境配置、显存优化和提示词工程等环节。其中,解决“CUDA error: no kernel image is available”等版本兼容性问题,以及针对“8G显存”等有限资源进行参数调优,是确

    weixin_33674976的博客 478

    JDK RMI探索与使用--序列化

    在RMI通信模型中有两个重要问题,一是远程对象的发现的问题,二是数据的传递问题。在java程序中,数据类型包括基本数据类型和引用数据类型,而RMI通信主要是引用类型的使用和传递。 引用类型的传递方式,对于在同一JVM中的传递时,因为参数的引用和程序同属于一个内存,传递起来没有问题,但是不同JVM,一个jvmA对象引用使用另外一个jvmB中的class文件进行实例化,不大可能,RMI是将对象在jvmB中实例化,并将对象发布到注册中心,当jvmA客户端调用的远程对象复制到本地时,通过注册中心找到远程对象在jv

    qq_27215113的博客 331

    超详细的YOLOv8项目组成解析:一站式指南了解其架构与组件

    最近的更新是关于“Segment ONNX Runtime example”的,意味着它添加了对ONNX运行时的支持,特别是针对模型分割功能的支持。这些文件和文件夹共同工作,以确保 YOLOv8 的文档是全面的、多语言的,并且始终保持最新。这些示例涵盖了从基本的对象检测到更复杂的图像分割和视频处理任务,为开发者提供了丰富的学习资源和应用指导。最近的更新也是关于 ONNX 运行时示例。这些文件夹共同构成了 YOLOv8 的基础框架,从数据处理和模型配置到实际的训练和推理引擎,以及实用工具和高级功能的实现。

    CDBmax的博客 1万+

    BMS菊花链芯片怎么选?一张表对比ADI、TI、NXP五大厂家的隔离通信方案

    本文深入对比了ADI、TI、NXP等五大厂商的BMS菊花链芯片隔离通信方案,涵盖技术演进、核心参数和场景化选型策略。通过实测数据和开发经验分享,帮助工程师在新能源汽车和储能系统中选择最优方案,提升通信可靠性和成本效益。

    weixin_33724046的博客 432

    关于Java RMI 中对象的序列化与反序列化

    关于Java RMI 中对象的序列化与反序列化。背景介绍:在RMI分布式应用系统中,服务器与客户机之间传递的Java对象必须是可序列化的对象。不可序列化的对象不能在对象流中进行传递。对象序列化扩展了核心 Java输入/输出类,同时也支持对象。对象序列化支持把对象编码以及将通过它们可访问到的对象编码变成字节流;同时,它也支持流中对象图形的互补重构造。序列化用于轻型持久性和借助于套接字

    随风奔跑的专栏 7352

    DSP配置I2C通讯(非IO口软件模拟时序)

    dsp即数字信号处理器,是一种广泛应用的嵌入式处理器,主要应用是实时快速地实现各种数字信号处理算法,目前,国际主要的dsp供应商是ti公司,其tms32系列产品占据了dsp市场近一半的份额,本文以TMS320F28377D为例,使用ti公司dsp开发工具ccs10.1配置i2c模块。 写这篇文章的缘由,因为市面上很多DSP其实内部是具有硬件I2C接口的,但由于网络上大部分资料和例程都是利用IO口模拟I2C时序进而实现I2C通讯的。给很多想学习硬件I2C通讯的小伙伴带来了困难。 下面先介绍一下配置步骤 1.E

    weixin_44387442的博客 5545

    Java RMI反序列化总结篇-01

    放一张seebug的图, 所以客户端要访问远程对象就由服务端首先把远程对象注册到注册表,然后客户端先访问注册表拿到远程对象的stub以后,此时就可以像访问本地一样调用远程对象方法,底层由stub再接受客户端的参数和方法,然后就是stub作为代理再帮客户端请求服务端,把参数和方法都发送到服务端,服务端接收到参数和方法后,在服务端进行执行,再把返回结果给客户端的stub,stub再给客户端,所以客户端实际上看不到底层的通信逻辑,这种架构设计已经屏蔽了底层通信。

    wfz2333的博客 1477

    NSGA-Ⅱ算法:从原理到实战,解锁多目标优化难题

    本文深入解析NSGA-Ⅱ算法在多目标优化中的应用,从原理到实战全面覆盖。通过快速非支配排序、精英策略和拥挤度比较三大创新,NSGA-Ⅱ有效解决了传统算法的效率与多样性问题。结合工业案例展示其在注塑工艺优化中的显著效果,为工程师提供实用解决方案。

    weixin_29207149的博客 367

    【灰度共生矩阵(GLCM)原理及代码实现】

    文章主旨详细介绍灰度共生矩阵(Gray-Level Co-occurrence Matrix, GLCM)的生成原理、核心特征量及其在图像纹理分析中的应用,并提供了可运行的Python代码实现。该网页是一篇理论结合实践的优秀技术文章。它不仅清晰地解释了GLCM这一经典纹理分析工具背后的数学原理,还提供了完整、可复现的代码,非常适合计算机视觉或图像处理领域的学习者和开发者入门并实践灰度共生矩阵。读者可以通过运行代码来直观理解GLCM如何工作,并提取图像的纹理特征。

    blotemj.blog.youkuaiyun.com 179

    java反序列化-RMI

    RMI(Remote Method Invocation),远程方法调用。跟RPC差不多,是java独立实现的一种机制。实际上就是在一个java虚拟机上调用另一个java虚拟机的对象上的方法。RMI依赖的通信协议为JRMP(Java Remote Message Protocol ,Java 远程消息交换协议),该协议为Java定制,要求服务端与客户端都为Java编写。这个协议就像HTTP协议一样,规定了客户端和服务端通信要满足的规范。(我们可以再之后数据包中看到该协议特征)。

    weixin_40151476的博客 1261

    PLC凸轮开关指令编程应用——控制算法

    凸轮开关指令的作用是在PLC程序中根据凸轮开关(Cam Switch)的状态执行不同的操作。凸轮开关通常是机械式的开关装置,它的位置会随着机械运动的变化而改变。凸轮开关的状态可以用来检测机器的位置、角度或其他相关信息,从而触发相应的控制动作。总结起来,凸轮开关指令是PLC编程中常用的一种控制算法,通过检测凸轮开关的状态来触发相应的操作。本文将介绍凸轮开关指令的应用和相应的控制算法,并提供相关的源代码示例。在这个示例中,凸轮开关状态的值代表不同的位置,根据凸轮开关状态的不同,执行相应的动作。

    LiJavascript的博客 1034

    java rmi反序列化靶场_什么是序列化和反序列化,在RMI中是否要实现 SERIALIZABLE 接口, SERIALVERSIONUID的用处是什么?...

    这里是修真院后端小课堂,每篇分享文从【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】八个方面深度解析后端知识/技能,本篇分享的是:【什么是序列化和反序列化,在RMI中是否要实现 SERIALIZABLE 接口, SERIALVERSIONUID的用处是什么?】标题:修真院java小课堂】什么是序列化和反序列化,在RMI中是否要实现 SERIALIZA...

    weixin_42149153的博客 205

    win10 跳过U8环境检测的IE WebControls.rar

    win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

    pscad IEEE标准系统搭建说明

    pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

    【修真院java小课堂】什么是序列化和反序列化,在RMI中是否要实现 SERIALIZABLE 接口, SERIALVERSIONUID的用处是什么?

    大家好,我是IT修真院西安分院第三期学员,一枚正直纯洁善良的JAVA程序员。 今天给大家分享一下,修真院官网JAVA任务八,深度思考中的知识点——什么是序列化和反序列化,在RMI中是否要实现 SERIALIZABLE 接口, SERIALVERSIONUID的用处是什么? 1.背景介绍 1.1 序列化 ...

    QiaoXM的博客 380

    Statistics and Machine Learning Toolbox

    Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

    【java安全】RMI

    RMI远程方法调用,是java独立的一种机制。RMI的作用就是在一个java虚拟机调用另一个java虚拟机上对象的方法在网络传输的过程中,RMI中对象是通过序列化的形式进行编码传输,既然有序列化,必然会有反序列化,RMI服务端在接收到序列化后的会将对象进行反序列化。在反序列化攻击中,我们可能找不到反序列化的点,那么使用RMI就可以作为反序列化利用链的触发点 *****

    leekos的博客,分享web安全相关知识~ 1564

    C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

    基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

    rmi在java中是什么,我什么时候应该在RMI中实现java.io.Serializable?

    我刚刚启动Java RMI并且在使用java.io.Serializable时遇到一些问题,所以任何人都可以给我一个必须实现java.io.Serializable的RMI示例.谢谢!!!更新:我做了一个简单的例子,但是,我认为由于输出不正确,仍然存在问题.人机界面包服务器;import java.rmi.Remote;import java.rmi.RemoteException;import ...

    weixin_39615984的博客 60

    RMI学习以及深入理解

    转自:http://blog.163.com/eye_ziye/blog/static/21447105120131127105623452/ Java RMI (Remote Method Invocation 远程方法调用)是用Java在JDK1.1中实现的,它大大增强了Java开发分布式应用的能力。Java作为一种风靡一时的网络开发语言,其巨大的威力就体现在它强大的开发分布式...

    活成自己想要的模样 574

    PRC之RMI:RMI原理详解

    定义 RMI(Remote Method Invocation)为远程方法调用,是允许运行在一个Java虚拟机的对象调用运行在另一个Java虚拟机上的对象的方法。这两个虚拟机可以是运行在相同计算机上的不同进程中,也可以是运行在网络上的不同计算机中。 Java RMI:Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使J.

    简单的坚持的专栏 1646

    RPC框架是啥之Java自带RPC实现,RMI框架入门

    本博客 猫叔的博客,转载请申明出处 学习系列 RPC框架是啥? Java自带RPC实现,RMI框架入门 首先RMI(Remote Method Invocation)是Java特有的一种RPC实现,它能够使部署在不同主机上的Java对象进行通信与方法调用,它是一种基于Java的远程方法调用技术。 让我们优先来实现一个RMI的RPC案例吧。 项目源码地址:RPC_Demo,记得是项目里面的...

    weixin_34272308的博客 148

    Java 使用RMI Java 使用RMI

    Java 使用RMI Java使用序列化的方式,可以实现远端的方法调用,在分工合作时非常方便。本文记录使用java标准库实现rmi 一、服务端 结构 . ├── pom.xml ├── src │ ├── main │ │ └── java │ │ └── hello │ │ ├── HelloImpl.java │ │ ...

    AlbenXie的博客 462

    java对象序列化与RMI

    基本的对象序列化 由于Java提供了良好的默认支持,实现基本的对象序列化是件比较简单的事。待序列化的Java类只需要实现Serializable接口即可。Serializable仅是一个标记接口,并不包含任何需要实现的具体方法。实现该接口只是为了声明该Java类的对象是可以被序列化的。实际的序列化和反序列化工作是通过ObjectOuputStream和ObjectInputStream来完成的。O

    Tim950709的博客 862

    rmi java_Java 使用RMI

    Java 使用RMIJava使用序列化的方式,可以实现远端的方法调用,在分工合作时非常方便。本文记录使用java标准库实现rmi一、服务端结构.├── pom.xml├── src│ ├── main│ │ └── java│ │ └── hello│ │ ├── HelloImpl.java│ │ ├── HelloSe...

    weixin_29304985的博客 213

    java rmi反序列化漏洞 简介

    目录 一、RMI简介 二、RMI示例 三、漏洞复现 四、漏洞分析 1、为什么这里的badAttributeValueExpException对象是通过反射构造,而不是直接声明? 2、为什么不直接将badAttributeValueExpException对象bind到RMI服务? 一、RMI简介 首先看一下RMI在wikipedia上的描述: Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程.

    whatday的专栏 1197

    java序列化和反序列化

    一、什么是Java序列化 Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长。但在现实应用中,就可能要求在JVM停止运行之后能够保存(持久化)指定的对象,并在将来重新读取被保存的对象。Java对象序列化就能够帮助我们实现该功能。 使用Java对象序列化,在保存对象时,会把其状态保存为一...

    weixin_30436891的博客 77

    Java之RMI和JNDI

    文章目录1 RMI1.1 rmi概念1.2 RMI基础运用1.2.1 定义一个远程的接口1.2.2 编写一个远程接口的实现类1.2.3 创建服务器实例1.2.4 编写客户端并且调用远程对象1.3 RMI反序列化攻击1.3.1 定义远程接口1.3.2 远程接口实现1.3.3 服务器1.3.4 客户端2 JNDI2.1 概念2.2 JNDI结构2.2.1 InitialContext类2.2.2 Reference类2.3 JNDI注入攻击2.4 JNDI注入+RMI实现攻击2.4.1 RMIServer代码2

    上善若泪 2536
    上一篇: java对象序列化与RMI
    下一篇: java Collection
    暗夜荆棘鸟
    博客等级 码龄12年 9粉丝 12原创
    评论
    成就一亿技术人!
    拼手气红包6.0元
    还能输入1000个字符
     
     条评论被折叠 查看
    添加红包

    请填写红包祝福语或标题

    个

    红包个数最小为10个

    元

    红包金额最低5元

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

    抵扣说明:

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

    余额充值