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

How to send Java objects that are not defined structures in Thrift

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

非常感谢任何建议。

更新 #1

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

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

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

  1. 序列化数据,例如变成 ByteBuffer 之类的
  2. 通过 binary
  3. 通过 Thrift 接口发送数据
  4. 将接收到的字节反序列化为 Java 个实体

服务可以这么简单

service MyCoolService {
   binary Foobar( 1: binary javaBytes)
}

一句警告

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

备选方案

另一种解决方案可能是使用 Thrift IDL 镜像域模型。当域模型较小 and/or 不经常更改时,这可能是一个解决方案。好处是您获得了交叉互操作性,但您付出了额外的复杂性和一些性能(在某处,数据必须以某种方式从一种模型转换为另一种模型)。

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

组合解决方案

当然,您也可以将这两个选项结合起来,例如通过 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)
}