java - 如何跨不同 JVM 保留对象标识

标签 java spring serialization remoting identity

具体来说,让我用 Spring http-remoting 示例来说明这个问题。

假设我们有这样一个简单接口(interface)的实现:

public SearchServiceImpl implements SearchService {
    public SearchJdo processSearch(SearchJdo search) {
        search.name = "a funky name";
        return search;
    }
}

SearchJdo 本身就是一个简单的 POJO。

现在,当我们通过http-remoting(Spring调用远程对象的机制,很像使用序列化的EJB)从客户端调用方法时,我们将得到:

public class HTTPClient {
    public static void main(final String[] arguments) {
        final ApplicationContext context = new ClassPathXmlApplicationContext(
            "spring-http-client-config.xml");
        final SearchService searchService =
            (SearchService) context.getBean("searchService");

        SearchJdo search = new SearchJdo();
        search.name = "myName"; 
        // this method actually returns the same object it gets as an argument
        SearchJdo search2 = searchService.processSearch(search);
        System.out.println(search == search2); // prints "false"
    }
}

问题是搜索对象因为序列化而不同,尽管从逻辑上看它们是相同的。

问题是是否有一些技术可以支持或模拟跨 VM 的对象标识。

最佳答案

你说过 - 对象标识不同于逻辑相等。

  • 对象身份与==进行比较
  • .equals(..)比较逻辑相等

因此覆盖equals() 方法,一切都会好起来的。请记住也要基于相同的字段覆盖 hashCode()。使用您的 IDE 为您生成这 2 个方法。

(Teracotta VM clustering 允许在 VM 之间共享对象,但这不适合您的情况。)

关于java - 如何跨不同 JVM 保留对象标识,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2994113/

相关文章:

java - 集成 Struts 2 和 hibernate 的最佳方法

java - 清理 spring/tomcat/jboss 库中的临时文件的正确方法

java - 一旦方法返回,传递给方法并反序列化的列表将变为空

java - RMI 方法中的参数

Java打印数组列表编号

java - 查找 <li> 元素中同名的最后一个链接

java - 为什么我们不能从内部类构造函数访问另一个内部类?

java - 如何使用 GSON 解析没有根元素的 JSON 文件

java - 用 jackson 序列化日期列表

multithreading - Spring @Async 限制线程数