我正在尝试创建一个系统,在每次 RMI 调用时,
1)收集有关当前本地系统状态的一些数据(比如说系统时间)
2) 将其序列化并透明地将其添加到通过调用通过线路发送的数据中(即,不更改被调用的 stub 方法的签名)
3)在另一端反序列化它并采取一些操作(假设将其记录到文件中)
4) 当方法返回时反向执行相同的操作
我一开始尝试使用 AspectJ 来做到这一点,在 java.rmi.server.RemoteRef 的调用方法中添加一个切入点,这将允许我将元数据添加到 params 对象数组中,但我现在发现AspectJ 无法建议已编译的代码,这很有意义。
那么,正确的方法是什么?
最佳答案
嗯,我不确定我是否从您所说的内容中获得了足够的上下文,但我认为您可以在传递到服务器和从服务器接收的对象的序列化/反序列化时编写元数据。
例如,假设您的服务器正在返回 Jedi 实例。 Jedi 是一个可序列化的类。然后,您可以使用 writeObject() 和 readObject() 方法(如 Java 序列化规范中所述)来写入客户端/服务器端可能需要的任何特殊附加信息。
例如:
public class Jedi {
....
private void writeObject(ObjectOutputStream stream) throws IOException {
stream.writeObject(new Date());
stream.defaultWriteObject();
}
private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
Date sysDate = (Date) stream.readObject();
System.out.println(sysDate);
stream.defaultReadObject();
}
}
唯一的问题是,您将被迫对与服务器交换的每个可序列化对象执行此操作。
关于java - 将元数据添加到 Java RMI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6500390/