conch-in-cradle level
获赞
439
粉丝
82
关注
40
看过 TA
2104
京都大学
2023
Java
IP属地:北京
23.9毕业🎓
私信
关注
头像
2023-05-24 21:27
已编辑
Java
投递中邮消费等公司10个岗位
0 点赞 评论 收藏
转发
头像
2023-04-16 14:38
Java
RPC(远程过程调用)是一种通信协议,用于使进程或程序之间在不同的计算机或网络之间进行通信。下面是一次RPC调用的过程:客户端(调用方)通过本地代理对象发起RPC调用请求。本地代理对象相当于客户端和远程服务端之间的中间层。本地代理对象将调用请求打包成一个网络消息,然后通过网络发送给服务端。服务端接收到消息后,将消息解包并确定调用的方法和参数。RPC(远程过程调用)是一种跨网络边界调用远程计算机程序的技术,其调用过程如下:客户端(调用方)发起RPC调用请求,调用的方法和参数都封装在本地代理对象中。本地代理对象相当于客户端和远程服务端之间的中间层。本地代理对象将调用请求打包成一个网络消息(称为RPC消息),并将其发送给远程服务端。远程服务端接收到RPC消息后,需要解包消息,获取请求的方法和参数。远程服务端在这一步需要进行一些基本的验证和鉴权,以确保请求来自合法的客户端。远程服务端根据请求的方法,调用本地的方法执行计算,并将结果打包成一个响应消息。远程服务端将响应消息发送回客户端。客户端接收到响应消息后,需要解包消息,获取响应的结果。客户端将响应结果返回给原始调用方。以上是RPC调用的一般流程,但是具体实现可能会有一些细微的差异,比如有些RPC框架会支持异步调用、负载均衡、容错处理、服务发现等功能。需要注意的是,RPC调用过程中可能会涉及到多个网络传输阶段,包括请求发送、请求接收、响应发送和响应接收。因此,网络延迟和传输错误等问题需要考虑在内。此外,为了确保安全性和可靠性,RPC框架通常会提供一些加密、认证、授权和事务处理等功能。服务端执行请求的方法,并将结果打包成一个网络消息,通过网络返回给客户端。客户端接收到结果消息,解包并提取结果数据。客户端得到结果数据后,将其返回给原始调用方。整个过程可以分为四个阶段:请求发送、请求接收、响应发送和响应接收。RPC调用的整个过程通常都是在网络上进行,因此需要考虑网络延迟和传输错误等问题。在实际应用中,需要注意安全性和可靠性等问题。
0 点赞 评论 收藏
转发
头像
2023-04-06 22:27
Java
在 Java 中,静态变量属于类级别,而不是对象级别。当一个类被加载时,它的静态变量就会被初始化,并在 JVM 进程内存中保持不变,直到 JVM 进程结束。因此,对静态变量的修改只对当前 JVM 进程有效,不会影响到序列化和反序列化的操作。当一个对象被反序列化时,Java 会根据序列化数据流中的信息重建对象,并恢复对象的状态。这时,如果序列化数据流中包含静态变量的信息,Java 会使用该信息对静态变量进行赋值。但是,由于静态变量的值在 JVM 进程中保持不变,因此对静态变量的修改不会影响到反序列化的结果。需要注意的是,在序列化和反序列化操作中,静态变量是不会被序列化和反序列化的。这意味着,如果一个类的静态变量发生了变化,只有在下一次 JVM 进程启动时才会生效,而不会影响到已经序列化的数据。因此,对于需要在序列化和反序列化中使用的变量,应该声明为实例变量,而不是静态变量。序列化版本号可自由指定,如果不指定,JVM会根据类信息自己计算一个版本号,这样随着class的升级,就无法正确反序列化;不指定版本号另一个明显隐患是,不利于jvm间的移植,可能class文件没有更改,但不同jvm可能计算的规则不一样,这样也会导致无法反序列化。什么情况下需要修改serialVersionUID呢?分三种情况。如果只是修改了方法,反序列化不容影响,则无需修改版本号;如果只是修改了静态变量,瞬态变量(transient修饰的变量),反序列化不受影响,无需修改版本号;如果修改了非瞬态变量,则可能导致反序列化失败。如果新类中实例变量的类型与序列化时类的类型不一致,则会反序列化失败,这时候需要更改serialVersionUID。如果只是新增了实例变量,则反序列化回来新增的是默认值;如果减少了实例变量,反序列化时会忽略掉减少的实例变量。
0 点赞 评论 收藏
转发
头像
2023-04-06 22:22
Java
transient 是 Java 关键字之一,用于指定某个成员变量不参与序列化和反序列化。在 Java 中,如果一个对象需要进行序列化和反序列化操作,那么这个对象的所有成员变量都会被写入序列化数据流中,并在反序列化时进行恢复。但是有些成员变量可能并不需要进行序列化和反序列化,例如一些敏感信息、缓存数据等,这时就可以使用 transient 关键字来指定这些变量不进行序列化和反序列化。当一个变量被声明为 transient 后,Java 在序列化对象时会忽略该变量,并在反序列化时使用该变量的默认值。例如,对于一个 transient 的字符串变量,序列化后该变量的值会被忽略,而在反序列化时该变量的值将被设置为 null。需要注意的是,transient 关键字只是用于序列化和反序列化操作,并不影响对象在程序运行时的状态。因此,在使用 transient 关键字时,应该注意保证对象在序列化和反序列化后的状态正确。同时,也应该避免在 transient 变量中存储敏感信息或关键数据,以确保系统的安全性和稳定性。除了 transient 关键字,Java 还有很多其他的关键字,下面列举一些常用的关键字:public:表示公共的,可以被任何类访问。private:表示私有的,只能被本类访问。protected:表示受保护的,只能被本类和其子类访问。static:表示静态的,与类相关而不是与实例相关。final:表示不可变的,常用于定义常量和防止继承和重写。synchronized:表示同步的,用于线程间的同步操作。volatile:表示易变的,用于多线程间的变量共享。abstract:表示抽象的,用于定义抽象类和抽象方法。interface:表示接口,用于定义接口类型。enum:表示枚举类型,用于定义枚举常量。
0 点赞 评论 收藏
转发
牛客网
牛客企业服务