如何在Thrift中发送未定义结构的Java对象

时间:2015-06-02 15:15:55

标签: java serialization deserialization thrift

有没有办法通过thrift将未在thrift文件中定义的Java对象作为结构从一个java应用程序发送到另一个java应用程序。 问题是我们正在使用一个拥有自己的域模型的外部库,我们需要通过thrift发送这些模型,那么有没有这样做的技术呢?

我们非常感谢任何建议。

更新#1

下面的答案正确解释了可能的解决方案,目前我们正在考虑创建一个镜像外部库类的自己的域模型(它足够小以便付出这样的努力)

1 个答案:

答案 0 :(得分:2)

将序列化实体交换为二进制数据

这是一个简单的三步过程:

  1. 序列化数据,例如进入ByteBuffer或类似
  2. 通过Thrift界面通过binary
  3. 发送该数据
  4. 反序列化接收到Java实体的字节
  5. 服务可以像

    一样简单
    service MyCoolService {
       binary Foobar( 1: binary javaBytes)
    }
    

    一句警告

    应该提到的是,这打破了Thrift所代表的跨语言系统的整体思想。您的二进制数据只能由Java程序理解。你被警告了。但另一方面,如果您的用例是这样的,那么API只在内部使用,这方面不会成为问题,它是一个合法的解决方案。

    替代解决方案

    另一种解决方案可能是使用Thrift IDL镜像域模型。当域模型很小和/或不经常改变时,这可能是一种解决方案。好处是您可以获得交叉互操作性,但是您需要增加复杂性和一些性能(某些地方,某些地方,数据必须从一个模型转换为另一个模型)。

    但是,如果域模型具有一定的复杂性,则会变得很麻烦。

    组合解决方案

    当然,您也可以将两种选项结合起来,例如:通过MultiplexTransport

    // the efficient, but Java-only way outlined at the beginning
    service MyCoolJavaService {
       binary Foo( 1: binary javaBytes)
    }
    
    // miror-model solution
    
    struct EntityOne { ... whatever you need ... }
    struct OtherEntity { ... whatever you need ... }
    struct ThirdEntity { ... whatever you need ... }
    
    service MyCoolModelService {
       EntityOne Foo( 1: ThirdEntity foo, 2: OtherEntity bar)
    }