发表于: 2020-07-18 23:35:55

1 1388


今天完成的事情

1. 调通了 springboot


2. 拆分了原来项目,rmi 调用跑通

现在跑通了基本的数据库 service,还没加上缓存、关键日志


3. 页面使用 freemarker 重写

还有个注册页面没写,其他的都写完了。

只感觉到语法不一样,模板没有继承,只有引用。


遇到的问题

1. rmi 传递自定义对象的时候报错

java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
java.lang.ClassNotFoundException: com.sap.oms.api_order.api_invoice.rmi1.IQrCodeScanner (no security manager: RMI class loader disabled)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at java.rmi.Naming.lookup(Unknown Source)
at com.test.rmi.QrCodeScannerClient.main(QrCodeScannerClient.java:22)
Caused by: java.lang.ClassNotFoundException: com.test.rmi1.IQrCodeScanner (no security manager: RMI class loader disabled)
at sun.rmi.server.LoaderHandler.loadProxyClass(Unknown Source)
at java.rmi.server.RMIClassLoader$2.loadProxyClass(Unknown Source)
at java.rmi.server.RMIClassLoader.loadProxyClass(Unknown Source)
at sun.rmi.server.MarshalInputStream.resolveProxyClass(Unknown Source)
at java.io.ObjectInputStream.readProxyDesc(Unknown Source)
at java.io.ObjectInputStream.readClassDesc(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
... 3 more


原因:

没有一致的序列化 ID


解决的方法:

给自定义对象加上序列化 ID

private static final long serialVersionUID = 4502271459638998294L;

客户端与服务端的序列化 ID 必须完全一样,实体类的包名也需要完全一致。


收获

1. 序列化

原来我做序列化的时候是直接 implements Serializable,但是实际上一直没出现问题纯属系统自动帮我做了序列化 ID 生成的操作。

通过 Serializable 来实现序列化是根据 serialVersionUID 是否相同来判断序列化对象的版本是否一致。

在反序列化时,当JVM判断出字节流中的 serialVersionUID 与当前 class 文件中的 serialVersionUID 不同时就会抛出 InvalidClassException 异常并返回 null。

当没有指定 serialVersionUID 的值的时候,JVM也会根据类名、成员方法及属性名自动生成 serialVersionUID。


但是这次做 rmi 的时候我的客户端与服务端是分两个项目开发的,我尝试过一模一样的实体类不设置序列化 ID 放在两边同样的包名下面,但是还是报错,JVM 的序列化 ID 算法可能还涉及到了一些其他的因素。


明天的计划

1. 完成页面,加上注册的部分


2. 加上缓存、关键日志



返回列表 返回列表
评论

    分享到