是否有一种方法可以通过 thrift 将未在 thrift 文件中定义的 Java 对象作为结构从一个 java 应用程序发送到另一个 java 应用程序。 问题是我们使用的外部库有自己的域模型,我们需要通过 thrift 发送这些模型,那么有什么技术可以做到这一点吗?
热烈欢迎任何建议。
更新#1
下面的答案正确解释了可能的解决方案,目前我们正在考虑创建自己的域模型来镜像外部库类(它足够小,可以付出这样的努力)
最佳答案
将序列化实体交换为二进制数据
这是一个简单的三步过程:
- 序列化数据,例如到
ByteBuffer
或类似的 - 通过 Thrift 接口(interface)以
二进制
的方式发送该数据 - 将接收到的字节反序列化为 Java 实体
服务可以很简单
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)
}
关于java - 如何发送未在 Thrift 中定义结构的 Java 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30600040/