0 0

Java使用jsonrpc,python来调其接口时如何传递自定义对象15

1,windows+java version "1.8.0_25"
2,jsonrpc库:jsonrpc4j + jackson
3,httpserver:jetty server + httpservlet

需求描述:

1,java端启动一个jsonrpc server并注册某个class例如class A

2,python使用jsonrpc client来远程调用class A中的create方法,其中create方法是new一个class B对象b并返回该对象

3,调用完成后python端返回得到一个序列化的对象b,打印出来实际个字典类型

4,python调用class A的callSetAge方法,参数为对象b和int型数据20

5,最后python调用class A的callGetAge方法,参数为对象b

java端代码如下

package jsonrpc_test;

import java.io.IOException;
import java.io.Serializable;
import java.util.logging.Logger;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.googlecode.jsonrpc4j.JsonRpcServer;

public class TestHttpServerlet extends HttpServlet
{
    private ObjectMapper mapper;
    private JsonRpcServer jsonRpcServer;

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException
    {
        jsonRpcServer.handle(req, resp);
    }
    
    @Override
    public void init(ServletConfig config) throws ServletException 
    {
        super.init(config);
        mapper = new ObjectMapper();
        
        boolean ser = mapper.canSerialize(User.class);
        System.out.println(ser);
        jsonRpcServer = new JsonRpcServer(mapper, new MethodClass(), MethodClass.class);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException
    {
        // TODO Auto-generated method stub
        super.doGet(req, resp);
        System.out.println("Get");
    }
    
    public class MethodClass
    {
        public User create() 
        {
            User user = new User();
            System.out.println(user.hashCode());
            return user;
        }
        
        public int callGetAge(User user)
        {
            System.out.println(user.hashCode());
            return user.getAge();
        }
        
        public void callSetAge(User user, int age)
        {
            System.out.println(user.hashCode());
            user.setAge(age);
        }
        
    }
}

 下面是User类的实现

package jsonrpc_test;

import java.io.Serializable;

public class User implements Serializable 
{
    private String name;
    private int age = 10;
    public User()
    {
        
    }
    
    public int getAge() 
    {
        return age;
    }
    public void setAge(int age) 
    {
        this.age = age;
    }
    public String getName() 
    {
        return name;
    }
    public void setName(String name) 
    {
        this.name = name;
    }
}

 问题描述

1,刚开始测试jsonrpc是否能返回自定义类的时候User是个空的类,什么都没有,当调用create的时候java端就报错了说User类不能序列化,然后查了一下解释,说User需要实现Serializable接口并创建一个无参的构造函数,并且所有的成员变量需要增加set和get方法,于是我按照这个说法做了之后不可被序列化这个问题解决了

2,序列化的问题解决了,但是事实上我测试发现当我python调了create,然后调了callSetAge,然后callGetAge,虽然我callSetAge和callGetAge都传入了create返回的对象,但是callGetAge得到还是一个初始化的值,并非我callSetAge设置的值,于是我在每个方法里都打印了下User对象的hashcode,发现事实上每个hashcode都不一样,这时候我明白为什么一个类能被序列化需要一个无参的构造函数,感觉就是jackson在做反序列化的时候是又重新new了一个对象,既然是通用的方法所以他只能去调无参的构造函数。所以才会hashcode不一样

3,最终的问题就是,根据上述需求和代码,我该如果修改才能使得我可以create返回的这个自定义对象传给python,当python又把这个对象作为函数参数传回来的时候我还能使用这个原始创建的对象去干别的事

4,事实上User只是我测试的一个类,实际上我拿到的是一个第三方提供的Jar包,里面是一些SDK,API,我需要返回一个API类,这个类显然不会像我自己定义的User一样还implements Serializable更不会有那么多set和get方法,那么我又该如何实现返回这个自定义类呢

2014年11月30日 01:42
目前还没有答案

相关推荐

    JSON RPC 2.0

    JSON RPC 2.0有多种编程语言的实现,如Python的`jsonrpc-server`和`jsonrpc-client`库,JavaScript的`jsonrpc-client`和`jsonrpc-server`模块,以及Java、C#等其他语言的相应实现。 通过理解和掌握JSON RPC 2.0,...

    JSON-RPC用户手册

    JSON-RPC(JavaScript Remote Procedure Call)是一种轻量级的远程过程调用协议,使用 JSON 编码数据,支持多种编程语言,包括 Java、Python、Ruby 等。JSON-RPC-Java 是 JSON-RPC 在 Java 平台上的实现,本手册将...

    matlab开发-jsonrpc2asetoClassestoEncodeEcodejsonrpcMessages

    在MATLAB开发中,JSON-RPC(Remote Procedure Call)...需要注意的是,因为MATLAB并不是一个标准的Web开发环境,所以这种类库通常是为特定项目定制,或者用于与MATLAB环境交互的其他语言(如Python或Java)之间的桥接。

    Python-ThriftPy2是ApacheThrift的纯python实现

    4. **高效的数据序列化和反序列化**:ThriftPy2 使用二进制协议进行数据交换,相比基于文本的协议(如 JSON 或 XML),它在传输大量数据时能显著提高性能。 5. **跨语言兼容性**:Thrift 的设计目标之一就是跨语言...

    json.jar扩展包

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它采用完全独立于语言的文本格式,但也使用了类似于C家族语言,包括C、C++、C#、Java、JavaScript、Perl、Python等。JSON是数据交换的理想选择,...

    json jar包

    使用这个`json.jar`库时,开发者通常需要先将其添加到项目的类路径中,然后通过导入相关的类和方法来调用其功能。例如,创建一个`JSONObject`实例,读取JSON文件,或者将Java对象转换成JSON字符串等。 总的来说,...

    thrift-java实例

    Thrift 是一种跨平台的通信框架,由 Facebook 在 2007 年开源,用于解决大规模系统中不同语言环境下的高效数据传输...在选择使用 Thrift 时,应考虑项目的特定需求,包括语言兼容性、性能要求和对动态调整的灵活性。

    protobuf rpc

    protobuf是Google开发的一种数据序列化协议,它允许开发者定义数据结构,然后生成能够读写这些数据的代码,支持多种编程语言,如C++, Java, Python等。而RPC则是一种让分布式系统中的不同节点之间能够像调用本地方法...

    rpc.rar_RPC windows linux

    2. **接口定义语言(IDL)**:为了确保客户端和服务器之间的兼容性,RPC系统通常使用接口定义语言来声明服务接口。例如,gRPC使用Protocol Buffers,这是一种强大的数据序列化协议。 3. **传输层**:RPC可以基于...

    python uiautomator Device端源码

    - **设备通信协议**: 了解客户端和服务器之间的通信协议,这涉及到JSON-RPC或其他类似协议的实现,用于传递测试指令和接收反馈。 - **线程和异步处理**: 由于UI自动化可能涉及多任务并行,源码中可能会包含线程管理...

    protobuf-java-3.4.0.zip

    3. **源代码(.java)**: 提供protobuf Java API的源代码,有助于开发者理解其内部工作原理,以及进行自定义扩展。 4. **示例和测试代码**: 用于展示如何使用protobuf的示例代码和对应的测试用例。 5. **文档**: ...

    protobuf-java-2.5.0.rar

    - RPC框架:很多RPC框架(如gRPC)基于protobuf作为接口定义和数据交换格式。 综上所述,protobuf-java-2.5.0是一个关键的组件,用于Java应用程序中的高效数据序列化。理解其工作原理和使用方法对于开发涉及数据...

    protobuf-java-3.1.0.rar

    4. **使用protobuf类**:在你的Java程序中,你可以实例化protobuf生成的类,填充数据,然后将其序列化为二进制流。反之,也可以从二进制流中反序列化出对象。 protobuf的优势主要包括: - **高效**:protobuf的二...

    protobuf-java-2.4.1下载

    在Java开发中,protobuf作为序列化工具,广泛应用于网络通信、数据存储和配置文件等领域,因为其具有高效、紧凑的二进制格式,同时提供了易于使用的API。 在protobuf-java-2.4.1版本中,主要包含以下知识点: 1. *...

    今日内容:三天精通Jmeter接口测试项目实战训练营(1).pdf

    在实际项目中,除了掌握JMeter的使用外,还需要熟悉相关开发语言(如Java、Python等),理解业务逻辑,配合版本控制系统(如Git)和持续集成工具(如Jenkins),确保测试的自动化和效率。此外,良好的文档记录和沟通...

    Google Protobuf 编译 成 java 文件

    在使用Protobuf时,我们需要编写`.proto`文件,这是定义消息结构的规范文件。在这个文件中,你可以声明各种数据类型,如消息、枚举和服务。例如: ```protobuf syntax = "proto3"; message Person { string name ...

    【异构系统数据交互之Hessian】

    在服务端源码中,Hessian服务通常通过实现特定的接口或者继承自定义的抽象类来创建。服务端会暴露一组Hessian服务接口,这些接口定义了可供客户端调用的方法。服务端实现这些接口并处理业务逻辑,当客户端通过...

    Protobuf-master包

    3. **序列化与反序列化**:在 Android 应用中,可以使用生成的 Java 类来实例化对象,填充数据,然后调用 `Message.toByteArray()` 进行序列化。反序列化时,使用 `Message.parseFrom(byte[])`。 4. **优化内存占用...

    protobuf-3.1.0.tar.gz

    6. **API使用**:在每个生成的代码中,有用于序列化和反序列化对象的方法,以及构造和操作消息的类。开发者可以轻松地在程序中集成protobuf,处理数据传输和存储。 7. **消息类型和字段**:protobuf支持基本类型如...

Global site tag (gtag.js) - Google Analytics